[프로그래머스] - LV1 신고 결과 받기 JavaScript

2022. 1. 22. 23:06·지난 글 모음
반응형

프로그래머스 2022 카카오 블라인드 코딩 테스트 문제이다.

레벨: 1

언어: JavaScript


 

문제풀러가기

 

코딩테스트 연습 - 신고 결과 받기

문제 설명 신입사원 무지는 게시판 불량 이용자를 신고하고 처리 결과를 메일로 발송하는 시스템을 개발하려 합니다. 무지가 개발하려는 시스템은 다음과 같습니다. 각 유저는 한 번에 한 명의

programmers.co.kr

문제 설명

신입사원 무지는 게시판 불량 이용자를 신고하고 처리 결과를 메일로 발송하는 시스템을 개발하려 합니다. 무지가 개발하려는 시스템은 다음과 같습니다.

  • 각 유저는 한 번에 한 명의 유저를 신고할 수 있습니다.
    • 신고 횟수에 제한은 없습니다. 서로 다른 유저를 계속해서 신고할 수 있습니다.
    • 한 유저를 여러 번 신고할 수도 있지만, 동일한 유저에 대한 신고 횟수는 1회로 처리됩니다.
  • k번 이상 신고된 유저는 게시판 이용이 정지되며, 해당 유저를 신고한 모든 유저에게 정지 사실을 메일로 발송합니다.
    • 유저가 신고한 모든 내용을 취합하여 마지막에 한꺼번에 게시판 이용 정지를 시키면서 정지 메일을 발송합니다.

다음은 전체 유저 목록이 ["muzi", "frodo", "apeach", "neo"]이고, k = 2(즉, 2번 이상 신고당하면 이용 정지)인 경우의 예시입니다.

입력값

  • id_list: 이용자의 id가 담긴 문자열 배열
  • repoort: 각 이용자가 신고한 이용자의 ID가 담김 문자열 배열
  • k: 정지 기준 신고 횟수 (포함)

출력 값

  • 각 유저별 처리 결과 메일을 받은 횟수를 담은 배열 풀이과정
  • 신고를 당한 유저의 신고 수, 신고한 유저의 id 알아야 한다.
  • 신고당한 유저의 id를 key로 하고 신고한 유저의 id를 배열로 저장하는 객체를 만들어서 문제를 해결했다.

풀이 아이디어

  • 신고 당한 유저의 신고횟수를 카운트하고 신고한 유저의 id를 저장한다.
  • 신고 당한 유저의 신고횟수가 k를 넘으면 신고한 유저의 id를 세어서 정답 배열에 넣는다.
  • 위의 정보를 저장하기 위해 객체를 사용하여 정보를 저장한다.

객체 예시 ( 문제 1번 k = 2)

key: 신고 당한 유저의 id
value: 신고를 한 유저의 id 배열

const report_list = {
  muzi: [apeach]

  frodo: [muzi, apeach] - 정지

  apeach: []

  neo: [frodo, muzi] - 정지
}

객체를 위와 같이 만들고 객체를 순회하면서 배열의 길이가 k이상인지 조사한다.

풀이 코드

function solution(id_list, report, k) {
    const answer = new Array(id_list.length);
    answer.fill(0) 
    const report_list = {} //


    id_list.map((user)=>{
        report_list[user] = [] //key로 userid를 value로 빈 배열을 가지는 객체
    })

    report.map((user)=>{
        const [user_id, report_id] = user.split(' ')
        if(!report_list[report_id].includes(user_id)){
            report_list[report_id].push(user_id)
        }        
    })

    for(const key in report_list){
        if(report_list[key].length >= k){ //이용정지 유저
            report_list[key].map((user)=>{
                answer[id_list.indexOf(user)] += 1
            })
        }
    }
    return answer;
}

코드 라인별 풀이

const answer = new Array(id_list.length);
answer.fill(0)

answer 배열을 id_list의 크기만큼 할당하고 fill함수를 사용하여 0으로 초기화한다.

id_list.map((user)=>{report_list[user] = []})

report_list 객체에 key는 uesr의 id 값을 value는 신고한 사람을 담기 위한 빈 배열을 추가한다.

report.map((user)=>{
  const [user_id, report_id] = user.split(' ')
  if(!report_list[report_id].includes(user_id)){
    report_list[report_id].push(user_id)
  }        
})

report의 값이 ["muzi frodo", ...] 와 같이 '신고한 id 신고당한 id' 형식의 띄어쓰기로 구분된 문자열을 split으로 자르고 각각 user_id와 report_id로 나눠주었다.
그리고 배열에 포함하는지 여부를 확인하여 포함하지 않을 때 신고자의 이름을 추가하였다.

for(const key in report_list){
  if(report_list[key].length >= k){
    report_list[key].map((user)=>{
      answer[id_list.indexOf(user)] += 1
    })
  }
}

report_list의 배열 길이가 k값 이상이면 정지된 유저이다.
answer에 해당 유저를 신고한 유저가 받은 메일을 수를 +1 하여준다.


더 좋은 방법이 있으시거나 고쳤으면 하는 부분이 있는 분은 언제든지 댓글 달아주세요 👍

반응형

'지난 글 모음' 카테고리의 다른 글

[프로그래머스] - LV1 모의고사 JavaScript  (1) 2022.01.22
[프로그래머스] -LV1 로또의 최고 순위와 최저 순위 JavaScript  (0) 2022.01.22
스프링 핵심 원리 - 기본편 3 좋은 객체 지향 설계의 5가지 원칙(SOLID)  (0) 2021.05.14
스프링 핵심 원리 - 기본편 2 좋은 객체 지향 프로그램밍이란?  (0) 2021.05.12
스프링 핵심 원리 - 기본편 1 스프링이란?  (0) 2021.05.12
'지난 글 모음' 카테고리의 다른 글
  • [프로그래머스] - LV1 모의고사 JavaScript
  • [프로그래머스] -LV1 로또의 최고 순위와 최저 순위 JavaScript
  • 스프링 핵심 원리 - 기본편 3 좋은 객체 지향 설계의 5가지 원칙(SOLID)
  • 스프링 핵심 원리 - 기본편 2 좋은 객체 지향 프로그램밍이란?
코딩하자영아
코딩하자영아
코딩공부내용 정리
  • 코딩하자영아
    코드치고 무게치고
    코딩하자영아
  • 전체
    오늘
    어제
    • 분류 전체보기 (84)
      • 개발 (3)
      • 지난 글 모음 (81)
  • 블로그 메뉴

    • 홈
    • 태그
    • 방명록
  • 링크

  • 공지사항

  • 인기 글

  • 태그

    html input
    sw정글사관학교
    목록 창 만들기
    conding test
    사용자 정의 객체
    Coding Test
    javascript
    JavaScrpit
    SW정글
    Express
    dfsbfs
    리액트
    React
    python
    HTML
    프로그래머스
    코딩테스트
    onChange
    회원가입 폼
    백준
    Spring
    정글sw
    malloc-lab
    PINTOS
    sw 정글
    자바스크립트 문자열 변수
    회원가입
    템플릿 문자열
    자바스크립트
    node.js
  • 최근 댓글

  • 최근 글

  • hELLO· Designed By정상우.v4.10.0
코딩하자영아
[프로그래머스] - LV1 신고 결과 받기 JavaScript
상단으로

티스토리툴바