새소식

알고리즘 테스트 ⏲/프로그래머스

[KAKAO RECRUITMEMT] 신고결과 받기 풀이 / JavaScript

  • -
 

프로그래머스

코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.

programmers.co.kr

 

작성 코드 (1차 시도 / 통과)

function solution(id_list, report, k) {
    const reportTable = Array.from({ length: id_list.length }, () => []); // 피신고자 테이블
    const answer = Array(id_list.length).fill(0) // 신고자 테이블
    
    report.forEach((v) => {
        const [reporter, reported] = v.split(" ") // 신고자, 피신고자
        const reportedIdx = id_list.indexOf(reported)
        if (!reportTable[reportedIdx].includes(reporter)) { // 피신고자 신고를 처음하는 경우
            reportTable[reportedIdx].push(reporter)    
        }
    })
    reportTable.forEach((v) => {
        if (v.length >= k) { // k번 이상 신고된 경우
            v.forEach((e) => answer[id_list.indexOf(e)] += 1) // 신고자에게 메일 통보
        }
    })
    return answer
}

 

구현 로직

신고 방향을 담은 report를 순회하면서 신고자(reporter)와 피신고자(reported)를 구분해줍니다. 만약 신고자가 신고한 피신고자를 한번도 신고하지 않았었다면 피신고자 테이블(reportTable)에 신고자의 이름이 없었을 것이므로 그러한 경우에만 피신고자 테이블에 신고자의 이름을 넣어줍니다. 피신고자 테이블로 인해 문제의 조건에 맞게 신고 횟수가 중첩되는 것을 방지할 수 있습니다.

 

신고 방향을 순회하고 나면 피신고자 테이블은 다음과 같이 값이 담기게 됩니다.

["apeach"] ["muzi", "apeach"] [] ["frodo", "muzi"]

이제 피신고자 테이블을 순회하면서 해당 피신고자가 k번 이상 신고된 경우, 위 케이스는 2번이기 때문에 frodo를 2번 신고한 신고자 muzi, apeach와 neo를 2번 신고한 frodo, muzi에게 메일이 전송되기 때문에 muzi는 2개의 메일을, frodo와 apeach는 1개의 메일을 받게 됩니다.

Contents

포스팅 주소를 복사했습니다

이 글이 도움이 되었다면 공감 부탁드립니다.