문제 링크
https://www.acmicpc.net/problem/1764
1764번: 듣보잡
첫째 줄에 듣도 못한 사람의 수 N, 보도 못한 사람의 수 M이 주어진다. 이어서 둘째 줄부터 N개의 줄에 걸쳐 듣도 못한 사람의 이름과, N+2째 줄부터 보도 못한 사람의 이름이 순서대로 주어진다.
www.acmicpc.net
시간 제한 / 메모리 제한
2 초 | 256 MB |
문제
김진영이 듣도 못한 사람의 명단과, 보도 못한 사람의 명단이 주어질 때, 듣도 보도 못한 사람의 명단을 구하는 프로그램을 작성하시오.
입력
첫째 줄에 듣도 못한 사람의 수 N, 보도 못한 사람의 수 M이 주어진다. 이어서 둘째 줄부터 N개의 줄에 걸쳐 듣도 못한 사람의 이름과, N+2째 줄부터 보도 못한 사람의 이름이 순서대로 주어진다. 이름은 띄어쓰기 없이 알파벳 소문자로만 이루어지며, 그 길이는 20 이하이다. N, M은 500,000 이하의 자연수이다.
듣도 못한 사람의 명단에는 중복되는 이름이 없으며, 보도 못한 사람의 명단도 마찬가지이다.
출력
듣보잡의 수와 그 명단을 사전순으로 출력한다.
예제 입력
3 4
ohhenrie
charlie
baesangwook
obama
baesangwook
ohhenrie
clinton
예제 출력
2
baesangwook
ohhenrie
문제 풀이를 위해 생각한 것
- 중복되는 값을 찾는 것은 즉 교집합을 찾는 것
- 교집합을 구하는 연산의 시간 복잡도는 얼마일까
사용한 자료구조
집합 자료구조.
집합 자료구조의 삽입, 삭제, 조회는 O(1)이며, 교집합 연산을 통해 중복을 효율적으로 제거할 수 있다.
풀이 코드
n, m = 입력값 split하여 정수로 변환
set1, set2 = 두 개의 집합 자료구조 선언
n번 동안:
set1.add(입력값)
m번 동안:
set2.add(입력값)
arr = list(set1 & set2) 교집합 연산한 결과 리스트 자료구조로 변환 및 할당
arr.sort()
arr의 원소 a에 대하여:
print a
시간 복잡도 분석
N+M개의 이름을 집합에 추가 -> O(1)(N+M)
교집합 연산 -> O(min(len(s), len(t))). 다만 최악의 경우 O(len(s) * len(t)) 가 될 수 있음.
정렬 -> O(NlogN)
출력 -> 최대 O(N)
따라서 N = M인 상황에서, 교집합 연산이 O(len(s) * len(t))인 최악의 경우에는 O(N^2).
일반적인 경우에는 O(NlogN)의 시간 복잡도를 가진다.
문제에서 중요한 부분
입력 받아야 하는 양이 많다. 파이썬 코드로 구현하게 된다면 sys.stdin.readline을 사용할 필요가 있다.
'CS > Problem-solving' 카테고리의 다른 글
백준 1302번 Pseudo code (0) | 2022.05.01 |
---|---|
백준 3986번 Pseudo code (0) | 2022.05.01 |
백준 1158번 Pseudo code (0) | 2022.05.01 |
백준 1021번 Pseudo code (0) | 2022.04.30 |
백준 1417번 Pseudo code (0) | 2022.04.30 |
댓글