문제 링크: https://school.programmers.co.kr/learn/courses/30/lessons/42576
1. 답은 맞았지만 효율성 테스트에 통과를 못했다
처음에는 그냥 단순히 participant에 있는 이름이 completion에 없으면 그 이름을 return 하면 되는 것이 아닌가라고 생각했는데 참가자 중에 동명이인이 있는 경우도 생각해야 했다.
따라서 participant에 해당 이름이 2개 이상 존재하고, completion 배열에 존재하는 해당 이름의 개수가 participant 배열에 존재하는 해당 이름의 개수보다 적다면 해당 이름을 return 했다.
function solution(participant, completion) {
for (var i = 0; i < participant.length; i++) {
// case 1
// 만약 participant에 해당 이름이 2개 이상 존재하고
// completion에는 해당 이름이 participant에 있는 것보다 적다면
// 해당 이름 return
let pp_count = participant.filter(element => participant[i] === element).length;
let cp_count = completion.filter(element => participant[i] === element).length;
if(!(pp_count == cp_count)) {
return participant[i];
}
// case 2
// 만약 participant에 있는 사람이 completion에 없다면
// 해당 이름 return
if(!completion.includes(participant[i])) {
return participant[i];
}
}
}
하지만 위 코드는 테스트를 통과하지 못했다. 정확성 테스트는 다 통과했지만, 효율성 테스트를 전부 통과하지 못했다 ㅠ. 아무래도 시간복잡도가 커서 그런 것 같다.
2. sort를 써보자
sort를 쓰라는 친구의 조언. 근데 왜 sort를 쓰지? 너무 의아했었다. 왜 sort를 쓸까.. 이름이 나온 횟수를 세서 정렬하는건가? 라고 생각을 하기도 했다.
계속 생각을 해보다가 깨달았다. 그냥 배열을 sort를 하면 되는구나!
자바스크립트에서 문자열 배열을 sort하면 abc순으로 정렬을 한다.
participant 배열과 completion 배열을 둘 다 abc순으로 정렬을 한 다음에, 두 배열의 같은 index에 서로 다른 이름이 있으면(즉, participant[i]와 completion[i]가 다르면) participant[i]를 return 해주면 되겠다는 생각이 들었고, 코드를 실행해보니 정답이었다!!
function solution(participant, completion) {
// participant와 completion을 sort한다.
participant.sort();
completion.sort();
// 만약 participant[i]와 completion[i]가 다르면 해당 이름을 return한다.
for(var i = 0; i < participant.length; i++) {
if(participant[i] !== completion[i]) {
return participant[i];
}
}
}
3. 다른 사람의 풀이
function solution(participant, completion) {
const map = new Map();
for(let i = 0; i < participant.length; i++) {
let a = participant[i],
b = completion[i];
map.set(a, (map.get(a) || 0) + 1);
map.set(b, (map.get(b) || 0) - 1);
}
for(let [k, v] of map) {
if(v > 0) return k;
}
return 'nothing';
}
- participant와 completion을 동시에 순회하면서, Map에 a가 있으면 해당 값에 더해주고, b가 있으면 해당 값에 1을 빼준다. (만약에 map에 존재하지 않은 이름이었으면 0으로 설정하고 +1을 하거나 -1을 해준다)
- map을 순회하면서 0보다 큰 참가자를 찾으면 그 참가자의 이름을 return한다.
Map을 활용한 깔끔한 풀이였다.
key와 value 값을 활용해야 하는 문제가 나오면 Map을 적극적으로 활용해야겠고, 그리고 for of 문을 활용해서 순회하는 방법도 내게 익숙하지 않은 문법인데 앞으로도 많이 쓰일 것 같아 사용법을 익혀놔야겠다는 생각을 하게 되었다.
'Programmers(JavaScript)' 카테고리의 다른 글
[프로그래머스 자바스크립트] ‘기능개발’ 풀어보기 (0) | 2024.07.17 |
---|---|
[프로그래머스 자바스크립트] ‘같은 숫자는 싫어’ 풀어보기 (3) | 2024.07.17 |
[프로그래머스 자바스크립트] '폰켓몬' 풀어보기 (2) | 2024.07.16 |
[프로그래머스 자바스크립트] 코딩테스트 입문 Day 9,10 풀어보기 (0) | 2024.02.14 |
[프로그래머스 자바스크립트] 코딩테스트 입문 Day 8 풀어보기 (0) | 2024.02.13 |