[TIL] 프로그래머스 코테 : 신고 결과 받기

gyulhana·2022년 3월 16일
0
post-custom-banner

단단히 잘못된 나의 코드 무엇이 문제인가

프로그래머스 코딩테스트 연습 : 신고 결과 받기

function solution(id_list, report, k) {
    const map1 = new Map();
    const map2 = new Map();
    
    // 중복 신고 제거
    const new_report = [];
    report.map((r) => !new_report.includes(r) && new_report.push(r));
    
    // Map 만들기
    id_list.map((id) => map1.set(id, 0));
    id_list.map((id) => map2.set(id, 0));
    
    // 유저별 신고 누적 수 카운트
    new_report.map((r) => {
        const reported = r.split(' ')[1];
        const amount = map1.get(reported)
        map1.set(reported, amount + 1);
    })
    
    // 게시판 정지 대상 유저 찾기
    const temp = [];
    id_list.map((id) => map1.get(id) === k && temp.push(id));
  	// 문제가 있었던 부분! 연산자를 >=로 바꾸어주었어야 했다.
    
    // 정지 유저 신고자 찾기
    new_report.map((r) => {
        const reporter = r.split(' ')[0];
        const reported = r.split(' ')[1];
        const amount = map2.get(reporter);
        if (temp.includes(reported)) {
            map2.set(reporter, amount + 1);
        };
    })
    
    // 정지 유저 신고자별 횟수
    const map2Iter = map2.values()
    const answer = [];
    
    for (let i = 0; i < id_list.length; i++) {
        answer.push(map2Iter.next().value);
    }
    
    return answer;
}

우선 Map 객체로 접근한 것까지는 좋은 시도였던 것으로 보여진다. 다른 풀이들도 Map객체를 이용해서 키, 밸류 값을 저장하고 있다. 그리고 아예 다른 풀이를 참고해서 새 코드를 짜던 중 문제를 발견했다. 인수로 받아온 k값 '이상'의 값을 갖는 요소에 대해 정지 처리를 해야 되는데 '===' 일치 연산자로 처리하고 있었으니 당연히 안 되는 게 뻔함. 후, 아무튼 해결했으나 너무 케이스가 많은 경우에는 시간 초과를 불러일으키고 있어서 새 풀이로 다시 작성했다. 새 풀이는 아래와 같다.

Set을 쓸 생각을 못 하고 있었어서 딥다이브 37장 공부한 후에 새로 써보았다. 덕분에 쉽게 중복 제거 처리를 할 수 있었고 Map도 좀 더 간결하게 써보았음.

function solution(id_list, report, k) {
    const reports = [...new Set(report)].map(r => r.split(' '));

    const reported = new Map();
    for (const r of reports) reported.set(r[1], reported.get(r[1]) + 1 || 1);
    
    const reporter = new Map();
    for (const r of reports) 
        reported.get(r[1]) >= k && reporter.set(r[0], reporter.get(r[0]) + 1 || 1);
    
    const answer = id_list.map(id => reporter.get(id) || 0);
    return answer;
}
profile
친절한 하루를 선물하고 싶은 사람
post-custom-banner

0개의 댓글