2개의 풀이를 봤는데 너무 배울점이 많아서 두개의 글을 쓰게 되었습니다.
배운점
중복 제거
우선은 파이썬으로 코테준비를 할때, set을 사용해서 중복을 제거했는데, 자바스크립트도 동일합니다.
// 중복 제거 후, 유저 ID, 유저가 신고한 ID 분리
let reports = [...new Set(report)].map((el) => el.split(" "));
우선적으로 new Set(배열) 을 통해서 중복을 제거하고, newArr = [...set] 스프레드 연산자를 사용하여 다시 배열로 만들어줍니다.
const arr = ['A', 'B', 'C', 'A', 'B'];
const set = new Set(arr);
const newArr = [...set];
console.log(newArr)
Map 데이터 set , get
for ([, report] of reports) {
reportId.set(report, reportId.get(report) + 1 || 1);
}
위 코드로 우선 배운 것은 쓰지 않는 값은 비워둘 수 있다는 점.
그리고 set(키값, value) 를 설정할 수 있다.
또한 get 할때 해당 key가 없을 경우 undefined 가 리턴되는데 그때문에 || 1 을 써 준것이다.
filter, reduce
좀 더 무리해서 filter와 reduce를 정리해보기로 했다.
const arr = ['A', 'B', 'C', 'A', 'B'];
const newArr = arr.filter((element, index) => arr.indexOf(element) === index);
console.log(newArr);
filter는 true 인 것만 배열로 다시 만드는 함수이다. 따라서 위 코드는
첫번째 element 가 'A' 일때 indexOf 로 나온 값이 0 이고 index 도 0 이기때문에 true 여서 'A' 값을 걸러지지 않는 것이다.
그런 순으로 'A' 'B' 'C' 모두 걸러지지 않지만 두번째 'A' 가 들어올때에는 indexOf = 0 , index = 3 이기 때문에 false 가 된다.
indexOf 는 동일한 값이 있을경우 가장 맨앞의 index 를 리턴하기 때문이다.
Reduce 는 누산기 개념이 존재한다.
acc 는 누산기(누산기라는 말이 어렵다 누적합이라고 하겠다.)
cur 는 현재값을 의미한다.
acc 의 default 값은 0 이다.
acc = 0 cur = 1 이고
acc = 1 cur = 2 ,
acc = 3 cur = 3 ,
acc = 6 cur = 4,
결국 acc = 10 이 되는 것이다.
const numbers = [1, 2, 3, 4];
const numbersSum = numbers.reduce((acc, cur) => {
console.log(acc, cur);
return acc + cur;
});
// 1 2
// 3 3
// 6 4
console.log(numbersSum);
// 10
아 참 default 값은 다음 처럼 변경이 가능하다. 10 으로 설정한 모습이다.
const numbers = [1, 2, 3, 4];
const numbersSum = numbers.reduce((acc, cur) => {
console.log(acc, cur);
return acc + cur;
},10);
위 개념을 확인했다면 이제 이 코드를 이해할 수 있다.
const arr = ['A', 'B', 'C', 'A', 'B'];
const initialValue = []
const newArr = arr.reduce((acc, obj) => acc.includes(obj) ? acc : [...acc, obj], initialValue)
console.log(newArr)
삼항연산자 때문에 조금 복잡하지만 하나씩 디버깅을 해봐야겠다.
default 값은 []이다.
첫번째 'A' 가 들어가면 acc에는 obj = 'A' 가 없기때문에 acc = ['A'] 가 된다.
첫번째 'B' 가 들어가면 acc에는 obj = 'B' 가 없기때문에 acc = ['A','B'] 가 된다.
첫번째 'C' 가 들어가면 acc에는 obj = 'C' 가 없기때문에 acc = ['A','B','C'] 가 된다.
두번째 'A' 가 들어가면 acc에는 obj = 'A' 가 존재한다. 따라서 삼항연산자의 true 항이 실행되어 그대로 acc = ['A','B','C'] 이다.
두번째 'B' 가 들어가면 acc에는 obj = 'B' 가 존재한다. 따라서 삼항연산자의 true 항이 실행되어 그대로 acc = ['A','B','C'] 이다.
참고한 코드
function solution(id_list, report, k) {
let answer = []
// 중복 제거 후, 유저 ID, 유저가 신고한 ID 분리
let reports = [...new Set(report)].map((el) => el.split(' '))
// 신고 당한 ID Map
let reportId = new Map()
// 신고 당한 ID 카운트
for ([, report] of reports) {
reportId.set(report, reportId.get(report) + 1 || 1)
}
// 메일 발송 ID Map
let mailId = new Map()
// 메일 발송 갯수 카운트
for ([user, report] of reports) {
if (reportId.get(report) >= k) {
mailId.set(user, mailId.get(user) + 1 || 1)
}
}
// 메일 발송 추출 (없는 경우 0)
answer = id_list.map((id) => mailId.get(id) || 0)
return answer
}
const id_list = ['muzi', 'frodo', 'apeach', 'neo']
const report = [
'muzi frodo',
'apeach frodo',
'frodo neo',
'muzi neo',
'apeach muzi',
]
console.log(solution(id_list, report, 2))
const id_list2 = ['con', 'ryan']
const report2 = ['ryan con', 'ryan con', 'ryan con', 'ryan con']
console.log(solution(id_list2, report2, 3))
출처: https://ghost4551.tistory.com/250 [프론트 개발자들을 위한 티스토리:티스토리]
'공부기록 > 자바스크립트 코딩테스트' 카테고리의 다른 글
프로그래머스/JS 소수 만들기 (0) | 2022.06.14 |
---|---|
자바스크립트 순열 , 조합 , 중복조합 (0) | 2022.06.14 |
프로그래머스/JS 신고결과받기 (1) (0) | 2022.06.13 |
백준/JS 10828 (0) | 2022.06.12 |
백준/JS 10926 (0) | 2022.06.12 |