알고리즘

[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. 결론

왜 첫번째 코드가 안된건지 사실 아직 좀 이해가 안간다.. 왜 그런지에 대해서 좀 더 찾아보고 공부를 해야할 것 같다..