일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | |||
5 | 6 | 7 | 8 | 9 | 10 | 11 |
12 | 13 | 14 | 15 | 16 | 17 | 18 |
19 | 20 | 21 | 22 | 23 | 24 | 25 |
26 | 27 | 28 | 29 | 30 | 31 |
- next js
- 함수형 프로그래밍 특징
- 리액트
- toggle-btn
- 웹팩 기본개념
- 항해99 사전스터디
- 자바스크립트 엔진 v8
- JS module system
- 리액트 메모
- 리덕스
- Js module
- 항해99 미니프로젝트
- chromatic error
- 항해99
- 리액트 메모이제이션
- FP 특징
- 항해99 부트캠프
- 웹 크롤링
- 코어자바스크립트
- v8 원리
- 리액트 렌더링 최적화
- 실행컨텍스트
- js배열 알고리즘
- 렌더링 최적화
- jwt
- this
- gql restapi 차이
- 테스트 코드 툴 비교
- 타입스크립트
- 알고리즘
- Today
- Total
Jaeilit
카카오 신고 결과 받기 본문
후기,
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 이 자주보이는듯 하다