알고리즘 신고결과 받기

태권·2022년 8월 29일
0

알고리즘

목록 보기
7/8

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

각 유저는 한 번에 한 명의 유저를 신고할 수 있습니다.
신고 횟수에 제한은 없습니다. 서로 다른 유저를 계속해서 신고할 수 있습니다.
한 유저를 여러 번 신고할 수도 있지만, 동일한 유저에 대한 신고 횟수는 1회로 처리됩니다.
k번 이상 신고된 유저는 게시판 이용이 정지되며, 해당 유저를 신고한 모든 유저에게 정지 사실을 메일로 발송합니다.
유저가 신고한 모든 내용을 취합하여 마지막에 한꺼번에 게시판 이용 정지를 시키면서 정지 메일을 발송합니다.
다음은 전체 유저 목록이 ["muzi", "frodo", "apeach", "neo"]이고, k = 2(즉, 2번 이상 신고당하면 이용 정지)인 경우의 예시입니다.

이 문제를 보고 나서 처음에 든생각은 객체를 이용하면 편하게 풀 수 있겠다 싶었다.
신고자이름에 신고건수를 붙이면 원활해 질것 같았기때문이다.

그래서 객체를 이용해서 문제 푸는 방법으로 접근을 해보았다.

여러방법을 찾던 도중에
Map과 Set에 대해 알게 되었고
쓰는 방법은 이렇다
Map

  • new Map() – 맵을 만듭니다.
    map.set(key, value) – key를 이용해 value를 저장합니다.
    map.get(key) – key에 해당하는 값을 반환합니다. key가 존재하지 않으면 undefined를 반환합니다.
    map.has(key) – key가 존재하면 true, 존재하지 않으면 false를 반환합니다.
    map.delete(key) – key에 해당하는 값을 삭제합니다.
    map.clear() – 맵 안의 모든 요소를 제거합니다.
    map.size – 요소의 개수를 반환합니다.

Set

  • new Set(iterable) – 셋을 만듭니다. 이터러블 객체를 전달받으면(대개 배열을 전달받음) 그 안의 값을 복사해 셋에 넣어줍니다.
    set.add(value) – 값을 추가하고 셋 자신을 반환합니다.
    set.delete(value) – 값을 제거합니다. 호출 시점에 셋 내에 값이 있어서 제거에 성공하면 true, 아니면 false를 반환합니다.
    set.has(value) – 셋 내에 값이 존재하면 true, 아니면 false를 반환합니다.
    set.clear() – 셋을 비웁니다.
    set.size – 셋에 몇 개의 값이 있는지 세줍니다.

for in 과 for of
간단하게 설명하면 for in은 객체 for of는 배열에 쓴다고 볼 수 도 있다.

for in은 enumerable한 것들만 출력한다.
enumerable은 객체의 property중 하나인데 이중 true인것만 출력한다.

for of는 iterable인 자료형들에만 적용 가능하다
여기에는 set 과 map 자료형도 있다.
iterable는 Symbol.iterator이라는 메서드를 지니고 있는 자료형을 말하고 Symbol.iterator이라는 메서드를 출력하면
Array Iterator {}이 출력된다.

function solution(id_list, report, k) {
    let reports = [...new Set(report)].map(a=>{return a.split(' ')});
    let counts = new Map();
    for (const bad of reports){
        counts.set(bad[1],counts.get(bad[1])+1||1)
    }
    let good = new Map();
    for(const report of reports){
        if(counts.get(report[1])>=k){
            good.set(report[0],good.get(report[0])+1||1)
        }
    }
    let answer = id_list.map(a=>good.get(a)||0)
    return answer;
}

문제는 처음에 중복되는 것은 1회로 처리 하기 때문에 중복값을 없애주기 위해Set을 통해 없애주었다.
그 후에 신고자와 받은자가 띄어쓰기로 나누어 져있어 split로 배열로 나누었고
신고받은 사람이 몇번 신고 받았는지 counts 라는 배열을 만들었고
신고횟수가 k번이상인 대상을 다시 신고한사람(이메일 받을 사람)에 이메일 을 보내주기 위해 다시 신고한사람 받을 이메일 을 가진 배열 good을 만들어 주었다.
그리고 신고 기준 이하는 0이기때문에 신고자의 이메일 받을 횟수를 가진 배열 answer을 만들었다.

profile
2022.08 개발자 시작

0개의 댓글