꾸준히 안타치기
1764 - 듣보잡(set) 본문
https://www.acmicpc.net/problem/1764
문제
김진영이 듣도 못한 사람의 명단과, 보도 못한 사람의 명단이 주어질 때, 듣도 보도 못한 사람의 명단을 구하는 프로그램을 작성하시오.
입력
첫째 줄에 듣도 못한 사람의 수 N, 보도 못한 사람의 수 M이 주어진다. 이어서 둘째 줄부터 N개의 줄에 걸쳐 듣도 못한 사람의 이름과, N+2째 줄부터 보도 못한 사람의 이름이 순서대로 주어진다. 이름은 띄어쓰기 없이 알파벳 소문자로만 이루어지며, 그 길이는 20 이하이다. N, M은 500,000 이하의 자연수이다.
듣도 못한 사람의 명단에는 중복되는 이름이 없으며, 보도 못한 사람의 명단도 마찬가지이다.
출력
듣보잡의 수와 / 그 명단을 사전순으로 출력한다.
예제 입력 1
3 4
ohhenrie
charlie
baesangwook
obama
baesangwook
ohhenrie
clinton
예제 출력 1
2
baesangwook
ohhenrie
💡 이 문제를 보고 내가 생각한 것들, 생각한 순서
듣도 못한사람과 보도 못한사람이 주어진다.
이때 이둘에 겹치는 사람을 구하는 문제같다.
입력받는 값: N 듣도 못한사람 , M 보도 못한사람 ( 이 중 중복되는 것을 출력한다. )
N
N
N
N+2 부터 M
M
M
M
💡 어떤 자료구조를 택했고 그 이유는?
리스트에 담을때에도 중복을 제거하고 넣기 → set사용
두 가지 데이터가 있고 중복이 되는 것을 추출해야하므로 → set의 교집합 연산사용
💡 그 자료구조를 이용해서 구체적으로 문제를 해결하는 로직 (풀이법)
듣도못한사람 -빈리스트를 만든다.
보도못한사람 - 리스트를 만든다.
첫 입력시 중복을 제거하는 set을 사용해 각각 담아준다.
set을 사용해서 두리스트의 교집합을 구한다.
리스트에 남은 이름들은 사전순서대로 출력해야하므로 sorted()로 알파벳순으로 바꿔준다.
듣보잡의 수를 구하기위해 교집합 리스트의 길이를 구하고, 출력한다.
n, m = map(int, input().split())
a = set()
for iin range(n):
a.add(input())
b = set()
for i in range(m):
b.add(input())
result = sorted(list(a & b))
print(len(result))
for i in result:
print(i)
# 듣도 못한값 , 보도못한값을 입력받음
n, m = map(int, input().split())
a = set()# a를 set해줌
for i in range(n): #듣도못한사람길이 만큼 a에 넣어준다.
a.add(input())
b = set()# b를 set해줌
for i in range(m): #보도못한사람길이 만큼 중복없이 b에 넣기
b.add(input())
result = sorted(list(a & b)) #정렬(리스트에담아서 a,b의 교집합)을 담는다.
print(len(result)) #result의 길이 출력
for i in result: # result내용 출력
print(i)
💡 문제에서 중요한 부분
셋의 특성을 잘알고 활용하기
set은 교집합, 합집합, 차집합 등의 연산을 지원한다.
집합에 들어간 원소는 순서가 보장되지 않는다. 정렬을 해주어야함
'CS > 백준' 카테고리의 다른 글
1302 - 베스트셀러(map) 💭 (0) | 2022.07.11 |
---|---|
3986 - 좋은단어(stack) (0) | 2022.07.11 |
1158 - 요세푸스 문제(deque) (0) | 2022.07.11 |
1417 - 국회의원 선거 (0) | 2022.07.11 |
7785 - 회사에 있는 사람(map) (0) | 2022.07.11 |