프로그래머스 - 신고 결과 받기(JavaScript Ver.)

Jeongwon Seo·2022년 2월 1일
0

알고리즘

목록 보기
8/8

인트로

Programmers에서 독학 첫 번째로 도전한 문제이다.
이걸 해결해보고자 한다.

문제

  • Level: 1
  • 언어: Javascript

문제보기

입력값

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

출력값

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

예시

id_list = ["muzi", "frodo", "apeach", "neo"]
report = ["muzi frodo","apeach frodo","frodo neo","muzi neo","apeach muzi"]
k = 2

이면

[2,1,1,0]

첫 화면

function solution(id_list, report, k) {
    var answer = [];
    return answer;
}

핵심 포인트

  • answer는 각 element가 number인 배열로 나와야 한다.
  • 신고 정보에 대한 정보가 필요하다.
    신고 정보는 여러 사람의 정보가 들어가며, '사람'과 '신고한 사람'의 쌍으로 들어간다.
    따라서 객체를 사용해야 한다.
  • 중복신고에 대하여 중복을 없애는 과정이 필요하다.

해결과정

  • 위의 answer 변수의 값을 [0,0,...,0]의 형식으로 바꿔주어야 한다.
const answer = new Array(id_list.length).fill(0);
  • 신고 정보에 대한 정보를 배열로 저장하고, '사람'과 '신고한 사람'의 쌍으로 맞춰주자.
    이때는 computed property를 사용하자.
const report_list = {};
id_list.map(user => {
  report_list[user] = []
})
  • report는 각각의 element가 "신고한 사람 + 신고할 사람"의 형식으로 되어있다.
    즉 space 공백을 따라서 나눠져 있다.
    문자를 공백을 기준으로 split 해주자.
report.map(el => {
  const [user_id, report_id] = el.split(' ')
})
  • 한사람이 똑같은 사람을 여러번 신고해도 하나로 처리된다.
    따라서 중복처리하는 것을 제거해주는 과정이 필요하다.
report.map(el => {
  const [user_id, report_id] = el.split(' ')
  if(!report_list[report_id].includes(user_id)) {
    report_list[report_id].push(user_id)
  }
})
  • 이제 report_list의 key를 순회하면서 k번 이상 신고받은 사람이 있을 때를 처리해줘야 한다.
for (const key in report_list) {
  if (report_list[key].length >= 2) {
    report_list[key].map(user => {
      answer[id_list.indexOf(user)] += 1
    })
  }
}
  • 그 다음에 answer를 return해주면 된다.

최종 코드

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;
}
profile
피트는 구덩이라는 뜻이다 구덩이를 파다보면 좋은 것이 나오겠지 (아싸 벡스룬)

0개의 댓글