해시테이블을 이용하는 기초적인 두 문제
숫자 카드2 (10816) [실버 IV]
n = int(input())
total = [card for card in map(int, input().split())]
m = int(input())
sangeun = [card for card in map(int, input().split())]
count = {}
for card in total:
count[card] = count.setdefault(card, 0) + 1
"""
위 구문을 풀어쓰면
if card not in count:
count[card] = 1
else:
count[card] += 1
"""
answer = ""
for card in sangeun:
print(count.setdefault(card, 0), end=" ")
"""
위 구문을 풀어쓰면
if card not in count:
answer += str(0) + " "
else:
answer += str(count[card]) + " "
이걸 숙지하면 다음처럼 string으로 변환을 굳이 안해도 된다.
print(answer[:-1])
"""
- 핵심은 써놨듯이 카드의 개수를 기반으로 한 해시테이블 생성하는 것이다.
- 이를 통해 별다른 추가 연산 없이, 전체 배열을 도는 것 없이, 빠르게 개수에 접근 가능하다.
- Dictionary로 구성하는 것이 제일 적합할 것으로 보인다.

듣보잡 (1764) [실버 IV]
n, m = map(int, input().split())
nohearsee = {}
for i in range(n + m):
name = input()
nohearsee[name] = nohearsee.setdefault(name, 0) + 1
answer = []
for name in nohearsee:
if nohearsee[name] == 2:
answer.append(name)
answer = sorted(answer)
print(len(answer))
for name in answer:
print(name)
- 처음 풀 때는 간단하게 전체 리스트를 돌게 한다.
- 돌면서 해시테이블 상으로 2로 기록되는 것을 답안으로 채택했다.
n, m = map(int, input().split())
nohear = {}
for i in range(n):
name = input()
nohear[name] = nohear.setdefault(name, 0) + 1
answer = []
for i in range(m):
name = input()
if name in nohear:
answer.append(name)
answer = sorted(answer)
print(len(answer))
for name in answer:
print(name)
- 영상 해설에서는 두번째 리스트를 키로 활용했다.
- 더 직관적이나 시간 차이 크게 없었다.
