문제
김진영이 듣도 못한 사람의 명단과, 보도 못한 사람의 명단이 주어질 때, 듣도 보도 못한 사람의 명단을 구하는 프로그램을 작성하시오.
입력
첫째 줄에 듣도 못한 사람의 수 N, 보도 못한 사람의 수 M이 주어진다. 이어서 둘째 줄부터 N개의 줄에 걸쳐 듣도 못한 사람의 이름과, N+2째 줄부터 보도 못한 사람의 이름이 순서대로 주어진다. 이름은 띄어쓰기 없이 알파벳 소문자로만 이루어지며, 그 길이는 20 이하이다. N, M은 500,000 이하의 자연수이다.
듣도 못한 사람의 명단에는 중복되는 이름이 없으며, 보도 못한 사람의 명단도 마찬가지이다.
출력
듣보잡의 수와 그 명단을 사전순으로 출력한다.
풀이
M, N은 최대 5*10^5이기에, for문 2번 도는 O(N^2) 알고리즘으로는 당연히 시간 초과가 뜬다. 안해봐도 앎. 그래서, 두 가지 방법이 있는데,
- '보도 못한 이름'의 list를 정렬한 후, '듣도 못한 이름'에 대해 for문 돌리면서 binary search (O(NlogN)) (TODO)
- 자료구조를 hash해두는 자료구조로 list 값을 옮기고(python이면 set), intersection 해버리기 (O(N))
leetcode에서 이 문제랑 비슷한 문제를 봤는데, 해당 문제를 정리하면서 더욱 자세한 논의를 작성할 예정이다.
코드
import sys
N, M = map(int, sys.stdin.readline().split())
set_1 = set()
set_2 = set()
for i in range(N):
set_1.add(sys.stdin.readline().rstrip())
for i in range(M):
set_2.add(sys.stdin.readline().rstrip())
set_1 = set_1.intersection(set_2)
answer = list(set_1)
answer.sort()
print(len(answer))
for people in answer:
print(people)
P.S.
듣보잡도 이제 '듣보잡' 유행어가 된 듯?
'PS > Hash Table' 카테고리의 다른 글
프로그래머스: 메뉴 리뉴얼 (Java) (0) | 2022.08.20 |
---|---|
백준 2015번: 수들의 합 4 (Java) (0) | 2022.06.28 |
백준 1920번: 수찾기 (JAVA) (0) | 2022.01.26 |
백준 11652번: 카드 (JAVA) (0) | 2022.01.26 |
백준 1620번: 나는야 포켓몬 마스터 이다솜 (JAVA) (0) | 2022.01.26 |