본문 바로가기

Algorithm/코딩테스트 고득점 Kit

[고득점 Kit / 해시] 완주하지 못한 선수 (해시맵)

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

 

프로그래머스

코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.

programmers.co.kr

 

이 문제는 해시맵을 사용하면 효율적으로 풀 수 있다.

 

파이썬에서는 해시맵을 딕셔너리라는 이름으로 제공하고 있다.

https://vegetableworld.tistory.com/48

 

[Python] 딕셔너리

딕셔너리란 무엇인가? 사람은 누구든지 "이름" = "홍길동", "생일" = "몇 월 며칠" 등으로 나타낼 수 있다. 파이썬은 영리하게도 이러한 대응 관계를 나타낼 수 있는 자료형을 가지고 있다. 요즘 사

vegetableworld.tistory.com

 

 

코드는 다음과 같이 작성하였다.

def solution(participant, completion):
    participant_count = {}

    for name in participant:
        if name in participant_count:
            participant_count[name] += 1
        else:
            participant_count[name] = 1

    # 완주자 수를 줄이기
    for name in completion:
        participant_count[name] -= 1

    # 완주하지 못한 선수 찾기
    for name in participant_count:
        if participant_count[name] > 0:
            return name

 

  1. for name in participant:
    • participant 리스트에 있는 각 참가자의 이름을 하나씩 name이라는 변수에 할당하며 반복
  2. if name in participant_count:
    • 현재 name이 participant_count 딕셔너리에 이미 존재하는지 확인
    • 만약 존재한다면, 즉 이 이름이 이미 한 번 이상 등장한 경우
  3. participant_count[name] += 1:
    • participant_count 딕셔너리에서 해당 name의 값을 1 증가시킴
    • 이는 해당 참가자가 추가로 등장했음을 의미
  4. else:
    • name이 participant_count 딕셔너리에 존재하지 않는다면, 즉 이 이름이 처음 등장하는 경우
  5. participant_count[name] = 1:
    • participant_count 딕셔너리에 name을 키로 하고, 그 값을 1로 설정
    • 이는 이 참가자가 한 번 등장했음을 나타냄
  6. 완주자 수 줄이기:
    • 초기 participant_count: {"leo": 1, "kiki": 1, "eden": 1}
    • completion을 순회하며:
      • "kiki"의 출현 횟수 감소 → {"leo": 1, "kiki": 0, "eden": 1}
      • "eden"의 출현 횟수 감소 → {"leo": 1, "kiki": 0, "eden": 0}
  7. 완주하지 못한 선수 찾기:
    • participant_count를 순회하며:
      • "leo"의 출현 횟수는 1이므로, 반환됩니다.