알고리즘
[Programmars] 완주하지 못한 선수 (JavaScript)
프린벼르
2022. 2. 11. 01:05
1. 나의 생각 흐름
처음에 짠 코드에는 sort로 정렬을 해주지 않고 for문을 이용해서 단순히 값이 일치하지 않으면 그 일치하지않는 값을 리턴하도록 했다. 그런데 테스트코드에서 2개만 통과하고 나머지 1개는 통과를 못했다. 그래서 정렬을 하고 일치하는지의 여부를 확인하게끔 다시 로직을 짜보았다.
2. 나의 코드 정리
//처음 짠 나의 코드
fuction solution(participant, completion){
let answer = '';
for(let x of participant){
if(x !== completion){ // 이부분의 조건이 잘못되었다는 것을 인지 못함..
// completion의 각각의 원소들이 알아서 비교될거라고 큰 착각을 함..
answer = x;
}
}
return answer;
}
//다시 풀어본 코드
function solution(participant, completion) {
let answer = '';
participant.sort(); // 오름차순 정리
completion.sort(); // 오름차순 정리
// 배열을 오름차순으로 정리해서 값을 비교해주기
for(let i = 0; i < participant.length; i++){
if(participant[i] !== completion[i]){
return participant[i];
}
}
}
처음 푼 코드를 보면 조건을 말도 안되게 썼다. 당연히 안되는거를 될거라 생각한 내가 너무 우습다😂.. 아직 갈길이 멀구만.. 그래서 다시 머리싸매고 푼 코드는 통과했지만, 찾아보니 sort를 쓰면 성능저하를 시킬 수 있다고 한다. 즉 시간내에 돌아가지 못한다고.. 하지만 현재의 내 머리에선 이 코드가 최선이다.. 좀 더 공부해야겠다..
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';
}
많은 사람들이 가독성이 좋다고 꼽은 코드다. 사실 중간중간에 처음보는 코드들도 있고.. map메소드에 대한 이해가 크지 못해서인지 map과 set을 쓴 부분이 무슨 소리인가 싶다. 좀 더 천천히 뜯어서 살펴봐야할 것 같다.
4. 결론
왜 첫번째 코드가 안된건지 사실 아직 좀 이해가 안간다.. 왜 그런지에 대해서 좀 더 찾아보고 공부를 해야할 것 같다..