본문 바로가기

algorithm/백준알고리즘

[백준알고리즘] 10816번: 숫자 카드 2 -Python

728x90

[백준알고리즘] 10816번: 숫자 카드 -Python

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

 

10816번: 숫자 카드 2

첫째 줄에 상근이가 가지고 있는 숫자 카드의 개수 N(1 ≤ N ≤ 500,000)이가 주어진다. 둘째 줄에는 숫자 카드에 적혀있는 정수가 주어진다. 숫자 카드에 적혀있는 수는 -10,000,000보다 크거나 같고, 10,000,000보다 작거나 같다. 셋째 줄에는 M(1 ≤ M ≤ 500,000)이 주어진다. 넷째 줄에는 상근이가 몇 개 가지고 있는 숫자 카드인지 구해야 할 M개의 정수가 주어지며, 이 수는 공백으로 구분되어져 있다. 이수도 -10,00

www.acmicpc.net

이분 탐색 문제이다.

 

하지만 이전 문제 "1920문제 수 찾기"에서 했듯이 딕셔너리를 이용해서 해결했다.

 

나는 이렇게만 풀었지만 다른 분들의 코드를 확인하니 직접 Binary Search 방식으로 푸신 분들도 많았고 종종 collections의 Counter 모듈을 이용해서 푸신 분들도 계셨다.

 

collections의 Counter는 생각지도 못한 방법이었는데 역시 많이 써봐야 다양하게 쓸 줄 아는 것 같다. collections.Counter()의 경우 리스트, 스트링, 딕셔너리 및 다양한 형태의 입력 인자를 허용하는데, 이 문제에서는 리스트로 입력 값을 저장한 뒤에 Counter()로 넘기면 딕셔너리 형태로 개수를 받을 수 있게 된다.

 

import sys

N = map(int, sys.stdin.readline())
keyList = list(map(int, sys.stdin.readline().split()))
pool = {}
for k in keyList:
    if k not in pool:
        pool[k] = 1
    else:
        pool[k] += 1

M = map(int, sys.stdin.readline())
target = list(map(int, sys.stdin.readline().split()))

for t in target:
    if t in pool:
        sys.stdout.write(str(pool[t]) + " ")
    else:
        sys.stdout.write("0 ")

 

잘못된 점이나 부족한 점 지적해주시면 감사하겠습니다

728x90