한 걸음씩 기록하며

[프로그래머스 코딩테스트] 완주하지 못한 선수 본문

알고리즘 & 코딩테스트

[프로그래머스 코딩테스트] 완주하지 못한 선수

Haksae 2022. 1. 17. 16:12

[완주하지 못한 선수]

문제 설명 :

수많은 마라톤 선수들이 마라톤에 참여하였습니다. 단 한 명의 선수를 제외하고는 모든 선수가 마라톤을 완주하였습니다.

마라톤에 참여한 선수들의 이름이 담긴 배열 participant와 완주한 선수들의 이름이 담긴 배열 completion이 주어질 때, 완주하지 못한 선수의 이름을 return 하도록 solution 함수를 작성해주세요.

 

⛏제한 조건

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

 

📁 입출력 예시

👉🏻  답안

function solution(participant, completion) {
  let answer = "";
  let a = participant.sort();       // sort로 유니코드(default) 순으로 문자열 정렬
  let b = completion.sort();

  for (let i = 0; i < a.length; i++) {
    if (a[i] !== b[i]) {            // for문으로 하나씩 대조
      return a[i];                  // 대조해서 없으면 참가자 이름 리턴
    }
  }
}

 

📑  간단한 설명

sort로 문자열 정렬해서 배열 따로 만들고, for문으로 하나씩 불러오며 대조하는 방식을 택했다.

사실 if 문 안에 sort를 바로 넣었었는데, 런타임 오류가 나서 sort를 위로 뺐다.

지금까지 풀면서 가장 다른 사람들의 답안(함수 사용)이 궁금한 문제였다

 

💪🏻 공부하면 좋을 답안

function solution(participant, completion) {
    const map = new Map();  // 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(key, value) 형태로 선언
        map.set(b, (map.get(b) || 0) - 1); // key에 a
    }                                      // value에 (map.get(a) || 0) + 1)

    for(let [k, v] of map) {               // for of로
        if(v > 0) return k;                // value > 0 면 return key
    }

    return 'nothing';
}
  • map 객체  ([['key1', 'value1'], ['key2', 'value2]])
  • set 객체 { }

 

  • map.set(a, map.get(a) || 0 ) + 1);
  • -> map을 set형태로 선언 : ([['key1', 'value1'], ['key2', 'value2]]) -> { 'key1', 'value1', 'key2', 'value2'}
  • -> key는 a, b : 참가자와 완주자 그대로 넣음
  • -> (map.get(a) || 0) +1 : 1) map에 a가 있는지 확인, 2) 있으면 1, 없으면 0, 3) 그 후에 +1을 하여 value로 보냄
  • -> 그러면 참가자에 명단이 없으면 value가 1, 명단이 있으면(동명이인) value가 2가 됨

 

  • map.set(a, map.get(a) || 0 ) + 1);
  • -> 동일한 패턴으로 진행되고, 1) map에 b가 있으면 1, 없으면 0 2) 그 후에 -1을 더하여 value로 보냄
  • -> 그러면 완주자 명단이 없으면 value가 -1, 명단이 있으면 value가 0이 됨

 

  • for문이 끝나면, 미완주자는 1, 완주자는 0임
  • 그러면 for of를 돌려서 value가 0이상인 인덱스의 key를 선언.

 

*map, set 객체 참고할 블로그

https://velog.io/@dolarge/Java-Script-Set-%EA%B3%BC-Map

 

 

Comments