[백준] 1764번 - 듣보잡

chanyeong kim·2022년 3월 13일
0

백준

목록 보기
39/200
post-thumbnail

📩 출처

문제

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

입력

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

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

출력

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

👉 생각

  • 듣지도 못한 사람과 보지도 못한 사람이 각각 따로 주어지지만, 그냥 하나의 리스트(lst)에 모두 담고 리스트의 요소들을 키로 하고 값을 0으로 하는 딕셔너리 answer을 생성한다.
  • 리스트에 에서 값을 하나씩 가져와서 answer의 키로 존재하면 1을 더해준다. 결과적으로 듣지도 못하고 보지도 못하는 사람은 값이 2인 친구들이다!
  • 값이 2인 친구들을 result에 담아주고 하나씩 출력을 해준다. sys는 뒤에 개행문자(\n)이 붙기 때문에 rstrip으로 제거해준다.
import sys
n, m = map(int, input().split())
lst = [sys.stdin.readline() for _ in range(n+m)]
answer = {k:0 for k in lst}

for k in lst:
    answer[k] = answer.get(k, 0) + 1
result = []
for k in answer.keys():
    if answer[k] == 2:
        result.append(k)
print(len(result))
for s in sorted(result):
    print(s.rstrip('\n'))
  • 딕셔너리 이외에 논리연산자 and를 적용할 수 있다. 듣지 못한 사람과 보지 못한 사람을 set으로 두고(set끼리 연산이 가능하기 때문에..!) and 연산을 해주면 공통인 사람들이 list에 담긴다..!!
import sys
n, m = map(int, input().split())
nameList = sys.stdin.read().splitlines()
hearset = set(nameList[:n])
seeset = set(nameList[n:])
ret = list(hearset & seeset)
ret.sort()
print(len(ret))
for i in ret:
    print(i)

0개의 댓글