알고리즘 문제(SOL)

[백준/1764/파이썬] 듣보잡

https://www.acmicpc.net/problem/1764

 

1764번: 듣보잡

첫째 줄에 듣도 못한 사람의 수 N, 보도 못한 사람의 수 M이 주어진다. 이어서 둘째 줄부터 N개의 줄에 걸쳐 듣도 못한 사람의 이름과, N+2째 줄부터 보도 못한 사람의 이름이 순서대로 주어진다.

www.acmicpc.net

조건

  • 첫째 줄에 듣도 못한 사람의 수 N ,보도 못한 사람의 수 M
  • 둘째 줄부터, N개의 줄에 걸쳐 듣도 못한 사람의 이름과 N+2째 줄부터, 보도 못한 사람의 이름이 순서대로 주어진다. 듣도 못한 사람의 명단에는 중복 되는 이름이 없고, 보도 못한 사람의 명단 도 마찬가지임.
  • 듣보잡의 수와 그 명단을 사전순으로 출력.

듣보잡 = 듣도 보지도 못한 잡놈

따라서, 듣도 못한 사람 명단에도 있고, 보도 못한 사람 명단에도 있는 사람을 찾아야함.

  1. 배열을 2개써서, 듣지못한 명단 1개 , 보지못한 명단 1개해서, 명단 1개를 기준으로 다른 명단을 하나하나 뒤져가는 방법 .
  2. 딕셔너리를 이용해서, 이름을 key, value를 Nohear,Nosee,NohearNosee 3가지로 해주면될듯.
#sol1) 배열 2개를 이용하는 방법
import sys 
input = sys.stdin.readline
a,b = map(int,input().split())
Nosee=[input() for _ in range(a)]
Nohear=[input() for _ in range(b)]
NsNh=[]

for ns in Nosee:
	for nh in Nohear:
		if ns == nh : NsNh.append(nh) # O(1)
print(len(NsNh))
for nn in NsNh:
	print(nn)
	
#시간 복잡도 O(N^2)
#sol2)map,dictionary를 이용하는 방법
import sys
input = sys.stdin.readline
a,b = map(int,input().split())
dic={}
ans=[]
cnt=0
for i in range(a):
	name=input().strip() #strip을 써줘야, key에 개행문자가 안들어감.
	dic[name]='nosee'

for i in range(b):
	name =input().strip()
	if name in dic:
		dic[name]='nohearnosee'
		cnt+=1
	else 
		dic[name]='nohear'

print(cnt)
for k,v in dic.items:
	if v =='nohearnosee':
		ans.append(k)
print(sorted(k))
#시간 복잡도 O(N) , dictionary는 hash니까 1, sorting -> NlogN
# 시간 복잡도 NLOGN