Jaeilit

카카오 신고 결과 받기 본문

알고리즘

카카오 신고 결과 받기

Jaeilit 2022. 8. 30. 23:40
728x90

후기,

 

1단계는 풀 줄 알았는데 카카오라서 그런가 너무 어려웠다.

테케는 통과했으나 채점돌리니 2개 빼고 다 틀렸다. 아마 그 2개가 테케 2개인듯 하다...

 

입출력 예제이다.

 

문제를 이해하는데도 한 10분이상 걸린듯 하다.

 

id_list 가 유저목록이고

report 가 신고 목록이다.

k는 신고를 이만큼 먹어야 정지 된다는 상수이다.

 

report 에서 ['muzi frodo'] 는 무지가 프로도를 신고했다는 뜻이다.

합계이다. 무지는 1번 프로도는 2번 어피치는 0 네오는 2번 신고를 당했는데

중요한건 사진의 밑에서 무지는 k 만큼 신고당해서 정지를 먹인 그 신고자에게 정지 시켰다는 메일을 보내는 횟수를 배열로 리턴해야하는 문제이다.

 

예를들어서.. 밑에 테이블에서 유저가 신고한 ID 를 보면 무지가 프로도, 네오를 프로도가 네오를 어피치가 무지와 프로도를 신고했는데

실제로 신고를 2번 당해서 정지 된 ID 는 테이블의 3번쨰인 무지가 신고한 프로도와 네오, 프로도가 신고한 네오, 어피치가 신고한 프로도이다.

 

무지가 정지되지 않은 이유는 신고를 k 만큼 그러니까 1번밖에 신고당하지 않았기 때문이다.

 

자 이제 신고자에게 신고자님이 신고한 사람 정지 됬습니다 라는 메일을 보내는데 몇번 보냈는지 이걸 배열로 반환해야한다.

 

무지는 타율이 10할이다 2명했는데 2명 다 정지됬따. 프로도, 네오 2

프로도도 타율이 10할이다 신고만 한다하면 정지가 되버린다. 무지와의 합작이다 네오 정지 1

어피치는 타율이 5할이다. 무지와 프로도를 신고 했는데 무지의 도움으로 프로도만 정지이다. 1

네오는 21세기 천사다. 아무도 신고 안했다. 문제와 상관없지만 자기는 신고당해서 정지먹었다. 불쌍핟.. 0

 

리턴 값은 [2, 1, 1, 0] 이 되어야한다.

 

틀린코드

function solution(id_list, report, k) {
  var answer = [];

  const obj = {};

  for (let i in id_list) {
    obj[id_list[i]] = [];
  }

  for (let i in report) {
    const [id, reports] = report[i].split(" ");
    obj[reports].push(id);
  }

  console.log(obj);
  //       	{
  //       muzi: [ 'apeach' ],
  //       frodo: [ 'muzi', 'apeach' ],
  //       apeach: [],
  //       neo: [ 'frodo', 'muzi' ]
  //   }
  //   { con: [ 'ryan', 'ryan', 'ryan', 'ryan' ], ryan: [] }

  const result = {};

  for (let i = 0; i < id_list.length; i++) {
    if (obj[id_list[i]].length === k) {
      for (let key of obj[id_list[i]]) {
        result[key] = result[key] ? result[key] + 1 : 1;
      }
    }
  }

  for (let i in id_list) {
    if (!result[id_list[i]]) {
      result[id_list[i]] = 0;
    }
  }

  console.log(result);
  // { muzi: 2, apeach: 1, frodo: 1, neo: 0 }
  // { con: 0, ryan: 0 }

  return Object.values(result).map((e) => e);
}

일단 나는 obj 객체를 만들어서 역발상으로 자기를 신고한 사람들을 배열로 나열 했다.

{
    muzi: [ 'apeach' ],
    frodo: [ 'muzi', 'apeach' ],
    apeach: [],
    neo: [ 'frodo', 'muzi' ]
}

자기를 신고한 사람을 배열로 나열한 이유는 2번 먹어야지 정지이기 때문에 정지인 유저를 가려내기 위함도 있고 이렇게 하면 쉬울것같았다.

 

프로도와 네오만 정지이다.

자 이제 누가 신고를 했는지 찾아보면 된다고 생각했다.

프로도를 정지시킨 사람 뮤지와 어피치에게 메일 1번씩

네오를 정지시킨 뮤지와 프로도에게 메일을 1번씩 보내면 뮤지는 2회 어피치1회 프로도 1회 여기에 이름이 없는 네오는 0이기에 [2,1,10] 이 된다.

  const result = {};

  for (let i = 0; i < id_list.length; i++) {
    if (obj[id_list[i]].length === k) {
      for (let key of obj[id_list[i]]) {
        result[key] = result[key] ? result[key] + 1 : 1;
      }
    }
  }

  for (let i in id_list) {
    if (!result[id_list[i]]) {
      result[id_list[i]] = 0;
    }
  }

  console.log(result);
  // { muzi: 2, apeach: 1, frodo: 1, neo: 0 }

채점에서 다 틀리고 이 테케 딱 2개만 붙었다.

 

정답코드

 

function solution(id_list, report, k) {
  const reportResult = report.reduce((a, c) => {
    const [user, reported] = c.split(' ');
    a[reported] = a[reported] ? a[reported].add(user) : new Set().add(user);
    return a;
  }, {});

  const mailed = Object.values(reportResult)
    .filter(set => set.size >= k)
    .flatMap(set => [...set]);
  return id_list.map(id => mailed.filter(user => user === id).length);
}

요즘 알고리즘에 map, set 이 자주보이는듯 하다

728x90

'알고리즘' 카테고리의 다른 글

백준 1920 이진탐색  (0) 2022.10.01
이진탐색  (0) 2022.09.17
투포인트 JS  (0) 2022.08.27
배열 검사  (0) 2022.08.23
스택구조  (0) 2022.06.23