개요
- 자바스크립트로 풀이하는 첫번째 알고리즘 문항
- 프로그래머스에서 감을 좀 쌓고 백준에서 난이도별로 풀어보는 것이 좋을 듯하다.
- 첫 문제를 풀며 느낀 점은 객체 짜기의 중요성인데, 가장 효율적이고 깔끔한 형태의 객체를 짜면 일단 뭐든 보이는 느낌
- 메서드 적응 훈련이 필요함. 책만 보다 막상 적용하려니 바로바로 안튀어나온다. 자주 쓰이는 건 노션에 넣고 정리하자
객체 짜는 코드
const userList = id_list.reduce((result, currentId) => {
result[currentId] = [0, []];
return result;
}, {})
1. Array.prototype.reduce 메서드인데, 이런 식으로 활용이 가능하다.
2. 문제를 처음 봤을 때 객체의 프로퍼티 값이 [카운트, [신고한 사람들]] 의 형태를 가졌으면 했는데, 이를 충족시키는 코드.
id_list.map((user)=>{
report_list[user] = [] //key로 userid를 value로 빈 배열을 가지는 객체
})
1. Array.prototype.map 메서드인데, map 메서드는 배열의 원소를 함수의 인자로 넣어 반환값을 모아 새로운 배열을 반환한다.
2. 따라서 위의 경우에는 Array.prototype.forEach 메서드가 더 적절해보인다. (배열의 원소들로 함수를 실행)
# JS CODE (1) - 내 코드
function solution(id_list, report, k) {
const reported_obj = id_list.reduce((result, current_id) => {
result[current_id] = [0, []];
return result;
}, {})
report.forEach((users) => {
const [user_id, report_id] = users.split(' ');
if (!reported_obj[report_id][1].includes(user_id)) {
reported_obj[report_id][1].push(user_id);
}
})
for (key in reported_obj) {
if (reported_obj[key][1].length >= k) {
reported_obj[key][1].forEach((id) => {
reported_obj[id][0] += 1;
})
}
}
const answer = id_list.map((id) => {
return reported_obj[id][0];
});
return answer;
}
1. 시간초과나 메모리 초과에 대한 감이 아직 안온다. 반복문 진짜 많은데 이중 반복문이 없어서 패스한건가 싶기도.
2. 마지막 처리를 조금 더 간단히 하고 싶은데 안떠오른다.
const banned = id_list.filter((id) => userList[id][0] >= k);
const emailList = id_list.map((id) => {
return userList[id][1].filter((id) => {
return banned.includes(id);
}).length;
});
-> 이분의 코드를 많이 참고했는데, filter 메서드 알아가자 (주어진 함수의 결과가 참인 원소들로 새로운 배열 반환)
# JS CODE(2) - 프로그래머스 우수 코드
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;
}
- map 객체 (array의 map 메서드랑 다름)
a. 데이터를 수집하여 활용하기 위한 객체
b. 키/값 타입에 제한이 없음
c. 데이터 검색 속도가 빠름
d. 이터러블하기 때문에 for/of 활용 가능
- 코드 설명
1. undefined + 숫자 => NaN이 나오는데, 5번이랑 10번, 13번 줄에 데이터 값을 설정하는 부분이 섹시하다. || 의 활용
2. Set 객체로 중복되는 값들을 없앴으며, ...(전개연산자 : 이터러블한 객체에 사용가능)를 사용하여 한번에 배열로 변경
3. 주어진 데이터의 선후관계나 이해도가 높아야 나올 수 있는 풀이이지 않나
'알고리즘 > 구현' 카테고리의 다른 글
[JavaScript] 2019 KAKAO 크레인 인형뽑기 (0) | 2022.05.02 |
---|---|
[JavaScript] 2021 KAKAO 숫자 문자열과 영단어 (0) | 2022.05.02 |
[Python] 백준, 1946 (0) | 2021.11.23 |
[Python] union-find (0) | 2021.10.09 |