문제: https://programmers.co.kr/learn/courses/30/lessons/42576
문제 설명
수많은 마라톤 선수들이 마라톤에 참여하였습니다. 단 한 명의 선수를 제외하고는 모든 선수가 마라톤을 완주하였습니다.
마라톤에 참여한 선수들의 이름이 담긴 배열 participant와 완주한 선수들의 이름이 담긴 배열 completion이 주어질 때, 완주하지 못한 선수의 이름을 return 하도록 solution 함수를 작성해주세요.
제한사항
- 마라톤 경기에 참여한 선수의 수는 1명 이상 100,000명 이하입니다.
- completion의 길이는 participant의 길이보다 1 작습니다.
- 참가자의 이름은 1개 이상 20개 이하의 알파벳 소문자로 이루어져 있습니다.
- 참가자 중에는 동명이인이 있을 수 있습니다.
입출력 예
participantcompletionreturn["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(p, c):
count = {}
for i in p:
count[i] = count.get(i, 0) + 1
for i in c:
count[i] -= 1
if (count[i] == 0):
count.pop(i)
return list(count.keys())[0]
풀이
def solution(p, c):
for i in c:
p.remove(i)
return p[0]
처음에는 리스트 그대로 받아서 p에서 c를 하나씩 제거하는 방식으로 문제해결을 시도했습니다. 정확성 테스트는 모두 통과했으나, 효율성 테스트에서는 통과를 하지 못했습니다.
고민한 결과 문제의 카테고리가 '해시'라는 것에 힌트를 얻어서 리스트로 들어온 데이터를 딕셔너리로 변환하여 처리했습니다.
def solution(p, c):
count = {}
for i in p:
count[i] = count.get(i, 0) + 1 // i에 해당하는 값을 가져옴, 존재하지 않으면 0 을 돌려줌
for i in c:
count[i] -= 1
if (count[i] == 0):
count.pop(i)
return list(count.keys())[0]
해결 방법
1. 리스트 형태인 p를 딕셔너리 count로 변환
2-1. 딕셔너리 형태인 count 에서 리스트 c의 값들을 키로 사용하여 값을 하나씩 뺌
2-2. 해당 키의 값이 0이면 딕셔너리에서 제거
3. 딕셔너리에서 남아있는 키를 반환
이 문제에서는 딕셔너리의 남아있는 키를 반환하도록 설정해서 해결했는데, 이는 문제의 앞부분에
수많은 마라톤 선수들이 마라톤에 참여하였습니다. 단 한 명의 선수를 제외하고는 모든 선수가 마라톤을 완주하였습니다.
라는 조건이 있으므로, 남은 키의 개수가 1개이기 때문에 사용할 수 있는 방법입니다.
'알고리즘 > 프로그래머스' 카테고리의 다른 글
프로그래머스 - 위장 / Python (0) | 2021.08.01 |
---|---|
프로그래머스 - 전화번호 목록 / Python (0) | 2021.08.01 |
프로그래머스 - 입양 시각 구하기(2) / Oracle (0) | 2021.07.30 |
프로그래머스 - DATETIME에서 DATE로 형 변환 / Oracle (0) | 2021.07.30 |
프로그래머스 - 오랜 기간 보호한 동물(2) / Oracle (0) | 2021.07.30 |