
https://www.acmicpc.net/problem/7785
입력이 최대 10^6개까지 있을 수 있으므로,
import sys
input = sys.stdin.read
를 통해 입력을 한꺼번에 읽어온다.
받은 입력을 리스트에 저장해주면서, strip() 을 통해 문자열 양끝의 공백을 제거하고, split('\n') 를 통해 각 줄을 리스트의 하나의 요소로 만들어준다.
data = input().strip().split('\n')
data의 첫번째 요소는 출입 기록의 수,
두번째 요소부터 n개의 요소는 출입 기록이다.
n = int(data[0])
records = data[1:n+1]
각 직원 이름마다 회사에 있는지/없는지를 저장해줘야 하기 때문에, 딕셔너리에 저장해준다. "이름 상태" 이런 식으로 저장되어 있을 것이기 때문에, 중간에 있는 공백을 기준으로 split() 해준다. 이름, 상태를 변수에 저장해주고 상태에 따라 True/False를 value로 저장한다.
for rec in records:
name, stat = rec.split()
if stat == "enter":
status[name] = True
elif stat == "leave":
status[name] = False
현재 회사에 있는 직원들만 추출해서 새로운 리스트에 저장해준다.
current = [name for name, present in status.items() if present]
status.items() 를 이용하면 딕셔너리의 (키, 값) 쌍을 순회하면서 작업을 수행하게 된다. name, present in status.items() 을 해준다는 것은 키를 name에, 값을 present에 저장하는 것과 같다.
if present (값이 True인 경우에만)
name 을 current 리스트에 저장해준다.
sort(reverse=True) 를 이용해 이 리스트를 사전 역순으로 정렬하고, 이름을 출력해주고 끝낸다.
import sys
input = sys.stdin.read
def main():
data = input().strip().split('\n')
n = int(data[0])
records = data[1:n+1]
status = {}
for rec in records:
name, stat = rec.split()
if stat == "enter":
status[name] = True
elif stat == "leave":
status[name] = False
current = [name for name, present in status.items() if present]
current.sort(reverse=True)
for name in current:
print(name)
if __name__ == "__main__":
main()