본문 바로가기
알고리즘/해시

[프로그래머스] 완주하지 못한 선수 - 파이썬

by 의탕 2020. 11. 22.

문제


programmers.co.kr/learn/courses/30/lessons/42576

 

코딩테스트 연습 - 완주하지 못한 선수

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

programmers.co.kr


문제설명


수많은 마라톤 선수들이 마라톤에 참여하였습니다.

단 한 명의 선수를 제외하고는 모든 선수가 마라톤을 완주하였습니다.

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

 

<제한사항>

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

<입출력 예>

 

participant completion return
[leo, kiki, eden] [eden, kiki] leo
[marina, josipa, nikola, vinko, filipa] [josipa, filipa, marina, nikola] vinko
[mislav, stanko, mislav, ana] [stanko, ana, mislav] mislav

 

<입출력 예 설명>

 

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

 

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

 

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

 


접근


파이썬에서 해시 자료구조인 딕셔너리를 알고있다면, 손쉽게 풀 수 있는 문제.

사실 딕셔너리를 알고 있더라도 문제를 보고서 딕셔너리로 풀어야한다는 사실을 바로 알아낼수 없을 것이다.

문제를 보고 해결을 위한 자료구조를 빠르게 알아내기 위해서는 다양한 문제를 많이 풀어보는 수밖에 없는것 같다.ㅠㅠ

 

<딕셔너리>

- 키와 값을 같이 저장하는 자료구조
- 요소의 추가, 변경, 삭제 가능
- 키는 중복, 변경 안됨. 키는 숫자, 문자열, 튜플만 가능
- 값의 중복, 변경 허용.


풀이


def solution(participant, completion):
    participant.sort()
    completion.sort()
    
    count = {}				# 딕셔너리 변수 count 선언(각 선수들을 카운트하기위해)
    for i in participant:
        if i not in count:	# 현재 참가자명이 count에 없으면
            count[i] = 1	# 현재 참가자명을 1로 세팅
        else:
            count[i] += 1	# 이미있으면 현재 참가자명을 +1

    for i in completion:
        if i in count:		# 현재 완주자명이 count에 있으면
            count[i] -= 1	# count -1

    for i in count:			# count 변수 확인
        if count[i] == 1:	# 1이면 (완주하지 못했다는 뜻)
            return i		# 리턴

마침


질문은 언제나 환영합니다

댓글