반응형

7785

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

 

7785번: 회사에 있는 사람

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

www.acmicpc.net

[정답]

1
2
3
4
5
6
7
8
9
10
11
12
import sys
= int(sys.stdin.readline())
= {}
for n in range(N):
    name, status = map(str, sys.stdin.readline().split())
    if status == 'enter':
        a[name] = '1'
    elif status == 'leave':
        del a[name]
= sorted(a.keys(), reverse = True)
for i in a:
    print(i)
cs

.

.

.

[풀이]

간단한 문제 같아 보여 처음엔 리스트를 이용하여 풀었다.

append()와 remove()를 이용하여서.

그런데 시간초과가 떴다.

이유는 remove()의 시간 복잡도가 O(n)이라 

for문을 생각하면 전체 시간 복잡도가 O(n^2)이 된다고 한다.

그래서 시간 초과가 뜨는 거라고 하는데 아직 시간 복잡도는 조금 더 공부해봐야할 것 같다.

 

아무튼 이 문제를 해결하려면 해싱, hashing을 이용하여야 한다고 질문글에서 봤다.

해싱은 무엇인가.

모르겠다.

공부해야할게 또 생겼다.

마침 자료구조와 여러 알고리즘들이 잘 설명되어 있는 블로그를 찾았다. 

한동안은 그 블로그를 보면서 공부할 생각이다.

 

해싱을 몰라도 파이썬에선 간단히 해결할 수 있다.

왜냐하면 파이썬의 딕셔너리가 해시로 구현되어 있기 때문이라고 한다.

따라서 딕셔너리로 del 과 sorted()를 이용해서 풀면 기초 수준의 문제로 난이도가 하락한다.

 

p.s.

장황하게 얘기했는데 요약하자면

1. 시간복잡도를 공부하자

2. 해싱을 공부하자

3. 알고리즘 블로그 공부한다고 ps(problem solving)가 뜸해질 수 있다.

반응형

+ Recent posts