[백준/Python] 7785 - 회사에 있는 사람

orangesnail·2024년 9월 24일

백준

목록 보기
38/169
post-thumbnail

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인 경우에만)
namecurrent 리스트에 저장해준다.

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()
profile
초보입니다. 피드백 환영합니다 😗

0개의 댓글