(프로그래머스) 완주하지 못한 선수

hwisaac·2024년 11월 7일
0

코테TIL

목록 보기
9/20

문제 링크

https://school.programmers.co.kr/learn/courses/30/lessons/42576

풀이

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

  for (let i = 0; i < participant.length; i++) {
    const name = participant[i];
    participantObj[name] = participantObj[name] ? participantObj[name] + 1 : 1;
  }

  for (let i = 0; i < completion.length; i++) {
    const name = completion[i];
    participantObj[name] -= 1;
  }

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

코드 리뷰 및 개선점

  1. 객체 생성 및 카운트 업데이트 효율성
    participantObj 객체에 참여자 수를 기록하고, 완료자 명단에서 카운트를 줄이는 방식은 합리적입니다. 이는 시간 복잡도가 O(n)으로, 효율적인 방식입니다.

  2. 네이밍 개선
    participantObj라는 네이밍은 다소 모호합니다. 객체의 역할을 명확히 나타내는 이름이 더 좋습니다.

  3. 의미 있는 초기화 및 결과 반환 루프
    첫 번째 루프와 두 번째 루프가 각각 역할을 수행하므로 코드가 이해하기 쉬워집니다. 다만 for...in 루프 대신 Object.keys로 key들을 순회하면 가독성이 더 좋아질 수 있습니다.

  4. 메모리 사용 최적화
    이 방식은 메모리 사용을 줄일 수 있으며, 객체 대신 Map을 활용하여 조금 더 성능을 개선할 수도 있습니다.

  5. 의미 있는 변수와 주석 추가


개선된 코드

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

  // 각 참가자의 카운트를 업데이트
  for (let i = 0; i < participant.length; i++) {
    const name = participant[i];
    participantCounts[name] = (participantCounts[name] || 0) + 1;
  }

  // 완주자 명단에서 참가자 카운트를 줄이기
  for (let i = 0; i < completion.length; i++) {
    const name = completion[i];
    participantCounts[name] -= 1;
  }

  // 카운트가 남아있는 참가자를 찾기
  return Object.keys(participantCounts).find(name => participantCounts[name] > 0);
}

오늘의 학습 (TIL)

문제: 마라톤에 참가한 선수 중 완주하지 못한 사람을 찾는 문제를 해결했다. 주어진 participant 배열과 completion 배열을 이용해 유일하게 완주하지 못한 한 명의 이름을 찾아내는 것이 목표였다.

해결 방법:
1. 참가자 명단 카운팅: participantCounts라는 객체에 각 참가자의 이름을 카운팅해 저장했다.
2. 완주자 명단 처리: completion 배열을 순회하면서 참가자 객체의 카운트를 줄였다.
3. 완주하지 못한 사람 찾기: participantCounts 객체에서 값이 1인 사람을 찾았다.

배운 점:

  • 객체를 활용한 카운팅 기법을 통해 효율적으로 문제를 해결할 수 있었다.
  • Object.keysfind 메서드를 사용해 깔끔하게 남은 참가자를 찾는 방법을 익혔다.

0개의 댓글