Algorithm - 완주하지 못한 선수

SeowooCHo2·2022년 5월 17일
0

알고리즘

목록 보기
20/28
post-thumbnail

완주하지 못한 선수

<프로그래머스 문제를 기반으로 합니다>

문제 설명

  • 수많은 마라톤 선수들이 마라톤에 참여하였습니다.
  • 단 한 명의 선수를 제외하고는 모든 선수가 마라톤을 완주하였습니다.
  • 마라톤에 참여한 선수들의 이름이 담긴 배열 participant와 완주한 선수들의 이름이 담긴 배열 completion이 주어질 때,
  • 완주하지 못한 선수의 이름을 return 하도록 solution 함수를 작성해주세요.

단 한명이라고 엄청 강조하네요??🤔

제한사항

  • 마라톤 경기에 참여한 선수의 수는 1명 이상 100,000명 이하입니다.
  • completion의 길이는 participant의 길이보다 1 작습니다.
  • 참가자의 이름은 1개 이상 20개 이하의 알파벳 소문자로 이루어져 있습니다.
  • 참가자 중에는 동명이인이 있을 수 있습니다.

동명이인 이라는 키워드 중요할 것 같다. 😗

입출력 예 설명

예제 #1
"leo"는 참여자 명단에는 있지만, 완주자 명단에는 없기 때문에 완주하지 못했습니다.

예제 #2
"vinko"는 참여자 명단에는 있지만, 완주자 명단에는 없기 때문에 완주하지 못했습니다.

예제 #3
"mislav"는 참여자 명단에는 두 명이 있지만, 완주자 명단에는 한 명밖에 없기 때문에
한명은 완주하지 못했습니다.

예제 #3을 어떻게 뽑아내는지가 중요할 것으로 보인다.

그럼 어떻게 풀면 좋을까??🤔

  1. 두 배열을 정렬해서 반복문을 통해 하나씩 점검한 다음 같은 index값의 element가 다를 경우 출력해주면 완주하지 못한 사람이 나올 것 같다.
  2. 다른 방법은 생각해내지 못했다 🤣🤣

<풀이 완성 코드>

function solution(participant, completion) {
    participant.sort()
    completion.sort()
    
    for(let i = 0; i < participant.length; i++){
        if(participant[i] !== completion[i]){
            return participant[i]
        }
    }
}

생각보다 되게 간단히 풀리는 문제였다.
다만 뭔가 다른 방법이 없을까.. 하고 다른 분들의 풀이를 찾아보는데

<추가 코드>

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 [key, value] of map){
        if(value > 0){
            return key
        }
    }
    return 
}

처음 보고 무슨 소리지 했다
근데 이 코드가 가독성이 좋다는 댓글이 있어 꼭 이해하고 넘어가야겠다 싶었고
자바스크립트에서 자주 쓰는 Hash Table 개념이 들어가있다고 했다.

그래서 map 함수와 Hash Table에 대해 공부해보았다.

<Map 함수 / Hash Table>

Map() JS 내장 객체는 새로운 배열을 만드는 함수들을 갖고있는 객체이다.

map.set(a, (map.get(a) || 0) + 1)
map.set(b, (map.get(b) || 0) - 1)

이 코드로 설명을 하자면,

map.set(key값, value값)

  • {key : value, key1 : value1 ....}
  • 이러한 형태의 Hash Table을 만드는 함수이다

map.get(key값)

  • 입력된 key값이 해당 Hash Table에 존재할 경우 True
  • 없을 경우 False를 반환하는 함수이다

이 배경 지식들을 바탕으로, 풀이를 해보면

  1. a라는 key 값을 넣어주는데, value 값으로 (map.get(a) || 0) + 1이 들어간다
  2. (map.get(a) || 0) + 1 여기에서 a라는 값은 아직 key값으로 대입되기 전 이기 때문에 map.get(a)는 false가 return되어 0이 반환되고 +1이 되어 value 값으로 1이 대입되는 것이다.
    • map.get(key) || 0 ==> map.get이 false 면 0을
    • map.get(key) && 0 ==> map.get이 true 면 0을

이 내용을 콘솔창에 찍어보면 이렇게 나온다 ( ̄︶ ̄)↗ 

마지막 undefined => -1은 completion 배열이 participant 배열보다 길이가 1 작기때문에 출력된 값이다.

즉 여기서 이 값들을 통해 Hash Table의 value 값이 0보다 큰 경우

for(let [key, value] of map){
        if(value > 0){
            return key
        }
    }

를 출력하면 탈락자의 key값이 return되게 되는것이다.

코드 하나로 몇시간을 보냈는지 모르겠다 🙂

하지만 이런게 싫다면 개발자 어떻게 해 ¯_(ツ)_/¯

즐겨~😁

profile
먹고 배우는 것엔 아끼지 말자구 ( ̄︶ ̄)↗ 

0개의 댓글