728x90

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

 

7785번: 회사에 있는 사람

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

www.acmicpc.net

 

# 조건

  • 각 직원은 자유롭게 출퇴근을 할 수 있다.
  • 상근이는 모든 사람의 출입카드 시스템의 로그를 가지고 있다.
  • 로그가 주어졌을 때, 현재 회사에 있는 모든 사람을 구하는 프로그램을 작성하시오.
 
입력
  • 첫째 줄에 로그에 기록된 출입 기록의 수 n이 주어진다. (2 ≤ n ≤ 106)
  • 다음 n개의 줄에는 출입 기록이 순서대로 주어지며, 각 사람의 이름이 주어지고 "enter"나 "leave"가 주어진다.
  • "enter"인 경우는 출근, "leave"인 경우는 퇴근이다.
  • 회사에는 동명이인이 없으며, 대소문자가 다른 경우에는 다른 이름이다. 
    • 사람들의 이름은 알파벳 대소문자로 구성된 5글자 이하의 문자열이다.
 

# 접근 방법 및 Solution

  • 회사에 출근하는 경우 리스트에 담아준다.
  • 이미 리스트에 존재하는데 이름이 또 나온다면 퇴근한 것이므로 remove 해준다.
  • 이후 sort를 내림차순으로 하여 출력
    • 당연한 '시간초과'
  • 따라서, 딕셔너리에 이름이 나온 횟수를 기록해주고
  • 홀수인 경우에만 리스트에 새로 담아주어서 출력해주었다.
 

시간초과 - 리스트 이용

import sys
input = sys.stdin.readline

people = []
N = int(input())
for _ in range(N):
    a, b = input().split()
    if not a in people:
        people.append(a)
    else:
        people.remove(a)

people.sort(reverse=True)
print(*people, sep='\n')
 

pass code - 딕셔너리 이용

import sys  
sys.stdin = open('input.txt')  
input = sys.stdin.readline  
from collections import defaultdict  
people = defaultdict(int)  
N = int(input())  
for _ in range(N):  
    a, b = input().split()  
    people[a] += 1  
  
result = [i for i,j in people.items() if j%2]  
result.sort(reverse=True)  
print(*result, sep='\n')
728x90