Notice
Recent Posts
Recent Comments
Link
관리 메뉴

윤일무이

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

⚙️ 코딩테스트

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

썸머몽 2023. 6. 9. 13:30
728x90

📌  문제

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

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

📌  제한사항

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

📌  풀이

알아야 하는 것

 

1. 객체로 먼저 풀어보았다.

1) 빈 객체 obj를 선언했다.

2) 참가자 배열을 순회하면서 obj에 참가자 이름을 키로 할당하고 값을 1을 주었다.

만약 obj에 참가자 이름의 키가 있다면 그 키의 값을 가져와 거기에 1을 또 넣게 하기 위해 || 를 사용했다.

3) 완주자 배열을 순회하면서 obj에 그 이름이 있을 경우 값을 -1 하도록 처리했다.

obj에 참가자로 들어가 있다면 지금 -1을 했을 때 0이 나와야 한다.

4) 객체 obj를 순회하면서 obj에 0보다 큰 값을 가진 키를 찾아낸다.  

function solution(participant, completion) {
  const obj = {};

  for (let name of participant) {
    obj[name] = (obj[name] || 0) + 1;
  }

  for (let name of completion) {
    obj[name] -= 1;
  }

  for (let name in obj) {
    if (obj[name] > 0) {
      return name;
    }
  }
}

 

2. Map으로도 풀어보았다.

1) Map을 생성한다.

2) 참가자 배열을 순회하면서 키, 값 쌍을 map에 삽입한다.

이 때 동명이인이 있을 수 있는 점을 감안해서 map에 이미 등록된 키인지 has 메서드로 확인한다. 그래서 이미 등록된 키라면 그 키의 값에 1을 더해주고, 등록되지 않은 키 (=지금 등록하려는 키)라면 0에서 1을 더해준다.

3) 완주자 배열을 순회하면서 키, 값 쌍을 map에 업데이트 한다.

완주를 했다면 참가자 배열과 완주자 배열 모두에 추가되어 있을 것이다. 그래서 1을 빼주면 정상적으로 완주한 사람은 +1 에서 -1이 되어 0이 될 것이고, 완주하지 못한 사람은 값이 0이 되지 않을 것이다. (양수)

4) let...of 루프로 map을 순회한다.

이 때 위에서 말한 것처럼 값이 0보다 큰 경우는 완주하지 못한 사람일테니, 이 값의 key를 리턴하면 완주하지 못한 사람의 이름을 얻을 수 있다.

function solution(participant, completion) {
  const map = new Map();

  for (let name of participant) {
    map.set(name, (map.has(name) ? map.get(name) : 0) + 1);
  }

  for (let name of completion) {
    map.set(name, map.get(name) - 1);
  }

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

 

이전에 진짜 엉망으로 풀었구나... ^^

has() 메서드 자리에 논리연산자 ||으로 대체하는 게 더 간단해보이긴 한다. 근데 걍 메서드 익숙해지려고 넣었음. 

 

 

728x90