김진영이 듣도 못한 사람의 명단과, 보도 못한 사람의 명단이 주어질 때, 듣도 보도 못한 사람의 명단을 구하는 프로그램을 작성하시오.
입력
첫째 줄에 듣도 못한 사람의 수 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문을 사용해서 예외처리를 해주었다
'Algorithm > BOJ' 카테고리의 다른 글
[백준 12865] 평범한 배낭 C++ (0) | 2021.02.26 |
---|---|
[BOJ] 프린터 큐_1966.c++ (0) | 2020.09.07 |
[BOJ] 정사각형_1485.py (0) | 2020.07.13 |
[BOJ] 설탕배달_2839.py (0) | 2020.06.09 |
[BOJ] 한수_1065 python (0) | 2020.06.09 |