나의 풀이
어렵기보단 실수를 유발할 수 있는 문제인 것 같다.
이번이 두 번재 풀이인데 첫 번째 풀이때와 똑같은 실수를 했다.
실수의 가장 큰 원인은 대충 작성한 코드때문이다.
코테문제를 풀다보면 빠르게 풀고나서 리팩터링을 진행하는데 빠르게 풀다보면 변수명, 함수명을 대충 정하기에 풀이가 길어지면 헷갈리거나 처음에 고려했던 부분을 고려하지 않게되는 경우가 발생해서 의도와 다른 답이 나와서 틀리는 경우가 있는데 오늘이 그랬다.
시간이 걸리더라도 풀이가 길어질때는 리팩터링 하면서 천천히 진행해야겠다.
이 문제에서 핵심은 아래와 같다.
즉 한 명이 여러명을 신고할 수 있지만 동일한 유저에 대해서는 딱 1회만 가능하다. 이걸 꼭 고려해줘야한다.
이 부분을 고려하지 않으면 테스트 케이스를 통과하지만 제출하면 2개만 맞추는 경우가 발생한다.
풀이 과정
1. 신고당한 유저를 key값으로 잡고 value에 신고한 유저를 배열로 넣어준다.
2. reportedUsers를 순회하면서 "이용 정지 기준"이상으로 신고당한 유저가 있다면 해당 유저를 신고한 사람이 받는 피드백 메일 개수 +1
3. map을 통해 'user ID' -> '피드백 메일 개수'로 변경
리팩터링 후
최대한 주석을 제외하고 변수명과 함수명으로 이해할 수 있도록 코드를 작성하였다.
function solution(id_list, report, k) {
// {신고 받은 유저1: [신고한 유저1, 신고한 유저2]} & 중복 x
const reportedUsers = getUsers(report)
const feedbackEmailRecipientsWithCount = getRecipients(reportedUsers, k)
return id_list.map((user) => feedbackEmailRecipientsWithCount[user] ?? 0)
}
function getUsers(report) {
const users = {}
const length = report.length
for (let i =0; i<length; i++) {
const [reporter, reportedUser] = report[i].split(" ")
if(users[reportedUser]){
users[reportedUser] = [...new Set([...users[reportedUser], reporter])]
continue
}
users[reportedUser] = [reporter]
}
return users
}
function getRecipients(reportedUsers, usageStopCriteria) {
const recipients = {}
for (let reportedUser in reportedUsers) {
const reporters = reportedUsers[reportedUser]
if(isUsageSuspended(reporters, usageStopCriteria)){
reporters.forEach((reporter) => {
recipients[reporter] = (recipients[reporter] || 0) + 1
})
}
}
return recipients
}
function isUsageSuspended(reporters, usageStopCriteria) {
return reporters.length >= usageStopCriteria
}
'알고리즘 > 프로그래머스 - JS' 카테고리의 다른 글
[프로그래머스-JS] level.2 거리두기 확인하기 (0) | 2023.06.10 |
---|---|
[프로그래머스] level.1 공원 산책 ⭐️ (0) | 2023.06.08 |
[프로그래머스-JS] level.2 요격 시스템 📌 (0) | 2023.06.02 |
[프로그래머스 - JS][kakao] level.1 성격 유형 검사하기 (0) | 2023.05.30 |
[프로그래머스 - JS] level.1 개인정보 수집 유효기간 (0) | 2023.05.30 |