본문 바로가기

Algorithm

[파이썬] 백준 7785번: 회사에 있는 사람

https://www.acmicpc.net/problem/7785

 

7785번: 회사에 있는 사람

첫째 줄에 로그에 기록된 출입 기록의 수 n이 주어진다. (2 ≤ n ≤ 106) 다음 n개의 줄에는 출입 기록이 순서대로 주어지며, 각 사람의 이름이 주어지고 "enter"나 "leave"가 주어진다. "enter"인 경우는

www.acmicpc.net

 
n = int(input())
log = []
for _ in range(n):
    log.append(tuple(map(str, input().split())))

check = set()
stay = []
for a, b in reversed(log):
    if not a in check:
        check.add(a)
        stay.append((a, b))
        
ans = [x[0] for x in stay if x[1] != 'leave']
ans.sort(reverse=True)
for x in ans:
    print(x)

 

1. log에 tuple 형태로 값을 받은 뒤 (예: [(Baha, enter), (Askar, enter)] 역으로 for문을 돌려줍니다. (reverse)

=> leave를 체크하기 위함입니다.

2. check라는 이름의 set을 만들어서 해당 set에 사람 이름이 없으면 넣고, stay라는 list에 그 사람의 tuple값을 넣어줍니다 (이름, enter/leave).

3. stay에서 특정 사람이 leave만 입력되어 있으면 제거합니다 (즉, 2번에서 이미 leave가 있는 사람은 stay list에 들어갔기 때문에 그 이후 enter와 같이 들어가지 않습니다).

4. 사전 역순으로 섞어준 후 출력합니다.