회사에 있는 사람

 

Baekjoon Online Judge

Baekjoon Online Judge 프로그래밍 문제를 풀고 온라인으로 채점받을 수 있는 곳입니다.

www.acmicpc.net

 

회사에 출입하는 사람의 기록이 남는다.

이 기록을 통해 회사에 남아있는 사람의 목록을 출력한다.

 


알고리즘

 

회사에 남아있는 사람을 체킹해야 하므로 출입 카운트를 해주었다.

  • 입장 + 퇴장은 무조건 짝수이므로 홀수 카운팅이된 사람은 회사에 남아있는 사람이다.
  • 입력 받은 이름을 정답 출력에 사용해야 하고 각각의 사람마다 카운팅 기록을 남겨주어야 하기 때문에 딕셔너리를 활용했다.

 


전체 코드와 알게된 점

import sys; input = sys.stdin.readline
n = int(input())
dic = dict()
least_name = []

for _ in range(n):
    name = input().rstrip().split()
    key = name[0]
    
    # enter와 leave 카운트
    if dic.get(key): dic[key] += 1
    else: dic[key] = 1

# 1번만 카운트 된 사람 == 아직 남아 있는 사람
for k, v in dic.items():
    if v % 2 == 1 :
        least_name.append(k)
    
ans = sorted(least_name, key = lambda x : x, reverse = True)
for i in ans:
    print(i)

 

 

내 코드는 이와 같은데 훨씬 간결하고 빠른 코드가 있어 첨부한다. 백준 사이트 문제 현황의 ugun0901py님의 코드이다.

 

import sys
input = sys.stdin.readline

N = int(input())
company = {}
for _ in range(N):
    man, state = input().rstrip().split()
    if state == 'enter':
        company[man] = True
    else:
        del company[man]

# 출력
print("\n".join(sorted(company.keys(), reverse=True)))

 

내 코드와 다르게 잘 작성된 점은 다음과 같다.

 

  1. 직접 카운팅 하지 않고 True, False로 걸러준 것
    • 이렇게 하면 딕셔너리에 어떤 숫자를 추가해주기 위한 dic.get() 체크를 하지 않아도 돼서 코드가 훨씬 간결해진다.

  2. lambda를 써서 정렬할 때 key를 지정하지 않고, dic.keys() 를 통해 바로 문자열 정렬을 해준 것

  3. 한 줄 한 줄 출력할 때는 for문 대신 "\n".join() 을 사용한 것

 

 

전체적으로 코드를 훨씬 직관적이고 간결하게 잘 작성하셔서 많이 배울 수 있었다.

sebinChu