Algorithm/BOJ

[BOJ] 1764 듣보잡

메린지 2022. 5. 12. 13:27

문제

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

입력

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

듣도 못한 사람의 명단에는 중복되는 이름이 없으며, 보도 못한 사람의 명단도 마찬가지이다.

출력

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

예제 입력 1

3 4
ohhenrie
charlie
baesangwook
obama
baesangwook
ohhenrie
clinton

예제 출력 1

2
baesangwook
ohhenrie

[풀이]

시간복잡도를 줄이기 위해서 딕셔너리를 사용해서 풀었다!!

듣도 못한 사람 명단은 받은 순서를 key, 사람 이름을 value로 하고,

보도 못한 사람 명단은 사람 이름을 key, 받은 순서를 value로 해서

공통 명단 리스트를 생성한 뒤에 듣도 못한 사람 명단을 key로 for으로 돌아가면서 사람 이름 value를

보도 못한 사람 명단에 있는지 찾았다, 이때 try~except 문을 써가지고 있는지 없는지 확인했다!!

그리고 오름차순 sort() 해서 출력 ㅎㅎ

import sys
n, m = map(int, sys.stdin.readline().split())
cnt_listen, cnt_see= {}, {}

for i in range(n):
    cnt_listen[i] = sys.stdin.readline().rstrip()
for i in range(m):
    cnt_see[sys.stdin.readline().rstrip()] = i

common=[]
for i in cnt_listen:
    try:
        tmp = cnt_see[cnt_listen[i]]
    except Exception as e:
        continue
    common.append(cnt_listen[i])

common.sort()
print(len(common))
for i in common:
    print(i)

빠른 사람들 풀이를 보니 set쓰고 교집합(&)를 써서 많이 푸는거 같다.. 내 1/2 속도 ㅋㅋ 대단하다

'Algorithm > BOJ' 카테고리의 다른 글

[BOJ] 11478 서로 다른 부분 문자열의 개수  (0) 2022.05.14
[BOJ] 1269 대칭차집합  (0) 2022.05.13
[BOJ] 10816 숫자카드2  (0) 2022.05.11
[BOJ] 10815 숫자카드  (0) 2022.05.09
[BOJ] 2559 수열  (0) 2022.05.04