백준 7785번 풀이

문제

로그 데이터를 바탕으로 회사에 있는 사람이 누구인지 사전 역순으로 출력하기

풀이

로그 데이터는 이름이랑 상태가 있는데 상태가 enter면 출근한거고 leave면 퇴근한거다. 그니까 이걸 토대로 현재 회사에 있는 사람을 찾으면 되는데… 아 이거 머리 터진다 그죠? 근데 머리 터질 일이 1도 없음. 일단 이 문제의 카테고리가 집합인 것을 잊지 말자.

import sys

K = int(sys.stdin.readline())
person = set()

K는 로그가 몇 줄이냐는 얘기고 person은 현재 회사에 있는 사람들을 표시하기 위한 집합. set이면 중괄호 안에 들어가는 건 맞는데, 그렇다고 걍 중괄호 치면 딕셔너리 되니까 주의하자.

import sys

K = int(sys.stdin.readline())
person = set()

for _ in range(K):
    who, where = sys.stdin.readline().split()
    print(who, where)

그 다음은 간단하다. 입력을 받을건데, 받아서 enter면 set에 넣고, leave면 set에서 뺀다. 끝이다. 솔직히 분리돼서 들어오는거 어떻게 할 지 막막하셨쥬? 근데 입력받을 때 변수 하나만 쓰라고는 안 했다.

import sys

K = int(sys.stdin.readline())
person = set()

for _ in range(K):
    who, where = sys.stdin.readline().split()
    if where == 'enter':
        person.add(who)
    elif where == 'leave':
        person.discard(who)

print(person)

이게 끝이다. set에서 뺄 때 뭐라고 하는지 까먹어서 자동완성으로 나온 discard() 썼음… discard도 버리다 뭐 이런 뜻이잖아요? 근데 이따 최종 코드를 보면 아시겠지만 discard 아니고 remove가 맞습니다. 아무튼 그럼. 그럼 우리에게 남은 건 뭐냐… 이걸 ‘사전 역순’으로 정렬하는건데, set은 정렬따원 되지 않는다. 그럼 어떻게 하냐고?

person = sorted(list(person))
person = reversed(person)

for i in person:
    print(i)

테마가 set인거지 리스트를 쓰지 말라고는 안 했음. 리스트로 바꾸면서 sorted()로 정렬하고 그걸 reversed()로 뒤집어서 출력하면 된다.

import sys

K = int(sys.stdin.readline())
person = set()

for _ in range(K):
    who, where = sys.stdin.readline().split()
    if where == 'enter':
        person.add(who)
    elif where == 'leave':
        person.remove(who)

person = sorted(list(person))
person = reversed(person)

for i in person:
    print(i)

그래서 이거 내면 맞음.