Algorithm/BOJ

[BOJ] 듣보잡_1764.py

Henu 2020. 6. 21. 23:22

김진영이 듣도 못한 사람의 명단과, 보도 못한 사람의 명단이 주어질 때, 듣도 보도 못한 사람의 명단을 구하는 프로그램을 작성하시오.

입력

첫째 줄에 듣도 못한 사람의 수 N, 보도 못한 사람의 수 M이 주어진다. 이어서 둘째 줄부터 N개의 줄에 걸쳐 듣도 못한 사람의 이름과, N+2째 줄부터 보도 못한 사람의 이름이 순서대로 주어진다. 이름은 띄어쓰기 없이 영어 소문자로만 이루어지며, 그 길이는 20 이하이다. N, M은 500,000 이하의 자연수이다.

출력

듣보잡의 수와 그 명단을 사전순으로 출력한다.

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
import sys
def DBJ(n:int):
    not_heard_seen = []
    person = []
    for _ in range(n):
        not_heard_seen.append(sys.stdin.readline().strip("\n"))
 
    not_heard_seen.sort()
    for i, name in enumerate(not_heard_seen):
        try:
            if name == not_heard_seen[i+1]:
                person.append(name)
        except IndexError:
            pass
    
    print(len(person))
    for i in person:
        print(i)
 
if __name__ == "__main__":
    n, m = map(int, sys.stdin.readline().split())
    DBJ(n+m)
 
cs

처음에 문제 보자마자 구현하기는 너무 쉬워보였다

그래서 아무생각없이 처음 시도한게 2중 for문을 써서 하나하나 확인하는 방식이었다

만약 n과 m이 각각 500000로 주어지면 반복횟수가 50만*50만 이 되어 당연히 시간초과가 날 수 밖에 없었다

 

그리고 두번째로는 한 리스트에 n+m 개수의 이름들을 다 받은 후 count==2인 이름만 골라내는 걸 생각했는데

말만 다르지 2중 for 문이랑 반복횟수는 다를게 없었다..

 

그래서 마지막으로 한 리스트에 이름들을 모두 받고 그 리스트를 정렬하면, 같은 이름은 당연히 서로 붙어있을 것을 이용했다

그래서 for문은 하나만 쓰고 i번째 이름이 i+1번째 이름과 같으면

i번째 이름을 임의의 리스트에 추가하는 식으로 했다

그러면 마지막i 번째 이름에서 i+1번째를 찾을 때 인덱스에러가 뜨는데 그건 try-except문을 사용해서 예외처리를 해주었다