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

허원영·2022년 1월 18일
15
post-thumbnail

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

레벨: 1

언어: JavaScript


문제 풀러가기
자세한 문제 설명은 위 링크를 통해 직접 읽어보시길 바랍니다. ㅎㅎ

입력값

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

출력값

  • 각 유저별 처리 결과 메일을 받은 횟수를 담은 배열

풀이과정

  • 신고를 당한 유저의 신고 수, 신고한 유저의 id 알아야 한다.
  • 신고 당한 유저의 id를 key로 하고 신고한 유저의 id를 배열로 저장하는 객체를 만들어서 문제를 해결했다.

문제 예시 1번 객체
key: 신고 당한 유저의 id
value: 신고를 한 유저의 id 배열

const report_list = {
  muzi: [apeach]

  frodo: [muzi, apeach] - 정지

  apeach: []

  neo: [frodo, muzi] - 정지
}

풀이코드

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_idreport_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하여준다.


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

profile
1년차 개발자

6개의 댓글

comment-user-thumbnail
2022년 4월 5일

풀이가 너무 깔끔하셔서 정보 얻어 갑니다 감사합니다 🙇‍♀️

1개의 답글
comment-user-thumbnail
2022년 4월 20일

해당 코테에 고민이 많았었는데 명쾌한 해결법으로 충격을 먹었네요 좋은 정보 공유 감사합니다.

1개의 답글
comment-user-thumbnail
2022년 8월 31일

명쾌하신 풀이네요 !
map 대신 forEach를 사용하시는 건 어떨까요 ?

1개의 답글