꾸준히 안타치기

1764 - 듣보잡(set) 본문

CS/백준

1764 - 듣보잡(set)

글자줍기 2022. 7. 11. 20:43
반응형

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
Comments