본문 바로가기

알고리즘/python

[python/파이썬] 백준 10546 배부른 마라토너

반응형

문제

마라토너라면 국적과 나이를 불문하고 누구나 참가하고 싶어하는 백준 마라톤 대회가 열린다. 42.195km를 달리는 이 마라톤은 모두가 참가하고 싶어했던 만큼 매년 모두가 완주해왔다. 단, 한 명만 빼고! 

모두가 참가하고 싶어서 안달인데 이런 백준 마라톤 대회에 참가해 놓고 완주하지 못한 배부른 참가자 한 명은 누굴까?

입력

첫째 줄에는 참가자 수 N이 주어진다. (1 ≤ N ≤ 105)

N개의 줄에는 참가자의 이름이 주어진다.

추가적으로 주어지는 N-1개의 줄에는 완주한 참가자의 이름이 쓰여져 있다. 

참가자들의 이름은 길이가 1보다 크거나 같고, 20보다 작거나 같은 문자열이고, 알파벳 소문자로만 이루어져 있다.

참가자들 중엔 동명이인이 있을 수도 있다. 

출력

마라톤을 완주하지 못한 참가자의 이름을 출력한다.

예제 입력 1 복사

3
leo
kiki
eden
eden
kiki

예제 출력 1 복사

leo

예제 입력 2 복사

5
marina
josipa
nikola
vinko
filipa
josipa
filipa
marina
nikola

예제 출력 2 복사

vinko

예제 입력 3 복사

4
mislav
stanko
mislav
ana
stanko
ana
mislav

예제 출력 3 복사

mislav

 

 

[소스 코드1 - 시간 초과]

 

간단하게 list.remove()를 쓰면 되지 않을까 싶어 혹시나 하는 마음에 제출해봤지만 시간 초과가 나온다.

import sys
input = sys.stdin.readline

n = int(input())
entry = []
for _ in range(n):
    entry.append(input())
    
for _ in range(n-1):
    entry.remove(input())

 

[소스 코드2 - 맞았습니다!]

 

dictionary를 사용해서 참가자의 이름과 참가 여부를 저장하고(+1)

완주하면 (-1) 해서 0이 되면 완주를 한 사람이 되는 것이고 1 이상의 값이 나오면 완주를 하지 못한 것이다.

동명이인이 인정이 되지만 dictionary는 중복 key 값을 저장하지 않으므로 

value 값을 증가시키는 방향으로 완주 여부를 체크하였다.

import sys
input = sys.stdin.readline

n = int(input())
start = []
finish = []
for _ in range(n):
    start.append(input())
for _ in range(n-1):
    finish.append(input())

entry = {}
for i in range(n):
    if start[i] not in entry:
        entry[start[i]] = 1
    else: 
        tmp = entry[start[i]]
        entry[start[i]] = tmp + 1
        
for i in range(n-1):
    tmp = entry[finish[i]]
    entry[finish[i]] = tmp - 1
    
for key in entry:
    if entry[key] == 1:
        print(key)
        break
반응형