티스토리 뷰

https://programmers.co.kr/learn/courses/30/lessons/92334

 

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

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

programmers.co.kr

 

해결방법

1. 동일 유저에 대한 신고는 여러번 가능해도 횟수는 1로 처리되므로 먼저 report의 중복 제거 

2. 신고 여부를 찾기 쉽게 report의 각 요소를 띄어쓰기를 기준으로 구분하여 배열 형태로 바꾸기

3. for문으로 신고를 받았을 때마다 신고 받은 횟수 count++

4. count가 k번 이상일 때만 신고자가 받을 메일 횟수 +1

 

 

풀이

function solution(id_list, report, k) {
    var report_arr = [];
    var answer = [];
    //메일 받을 횟수가 들어갈 배열
    for (let i = 0; i < id_list.length; i++){
        answer.push(0);
    }
    //중복제거
    let report1 = [...new Set(report)];
    //각 요소를 배열 형태로
    for (let text of report1){
        report_arr.push(text.split(' '));
    }
    for (let i = 0; i < id_list.length; i++){
        let count = 0;
        //신고받았으면 +1
        for (let j = 0; j < report_arr.length; j++){
            if (id_list[i] === report_arr[j][1]) count++;
        }
        //신고를 총 k번 이상 받았을 때만 신고자의 메일 횟수 +1
        if (count >= k) {
            for (let s = 0; s < report_arr.length; s++){
                if (id_list[i] === report_arr[s][1]){
                    answer[id_list.indexOf(report_arr[s][0])]++;
            }
          }
        }
    }
    return answer;
}

 

배운 점

1. map을 사용하자

다른 분의 풀이에서 map으로 더 간결한 코드를 작성한 것을 보았다

배열의 요소를 하나씩 사용해야 때 map에 더 익숙해져야겠다는 생각이 들었다

나는 아래 코드와 같이 report를 중복 제거하여 report1에 저장 한 후 for문을 이용해 report_arr에 하나씩 push했다

let report1 = [...new Set(report)];
for (let text of report1){
    report_arr.push(text.split(' '));
}

map을 쓴다면 이렇게 한 줄로 해결할 수 있다

let report_arr = [...new Set(report)].map(a => a.split(' '));

 

댓글