문제
숫자 카드는 정수 하나가 적혀져 있는 카드이다. 상근이는 숫자 카드 N개를 가지고 있다. 정수 M개가 주어졌을 때, 이 수가 적혀있는 숫자 카드를 상근이가 몇 개 가지고 있는지 구하는 프로그램을 작성하시오.
입력
첫째 줄에 상근이가 가지고 있는 숫자 카드의 개수 N(1 ≤ N ≤ 500,000)이가 주어진다. 둘째 줄에는 숫자 카드에 적혀있는 정수가 주어진다. 숫자 카드에 적혀있는 수는 -10,000,000보다 크거나 같고, 10,000,000보다 작거나 같다.
셋째 줄에는 M(1 ≤ M ≤ 500,000)이 주어진다. 넷째 줄에는 상근이가 몇 개 가지고 있는 숫자 카드인지 구해야 할 M개의 정수가 주어지며, 이 수는 공백으로 구분되어져 있다. 이수도 -10,000,000보다 크거나 같고, 10,000,000보다 작거나 같다.
출력
첫째 줄에 입력으로 주어진 M개의 수에 대해서, 각 수가 적힌 숫자 카드를 상근이가 몇 개 가지고 있는지를 공백으로 구분해 출력한다.
예제 입력 1
10
6 3 2 10 10 10 -10 -10 7 3
8
10 9 -5 2 3 4 5 -10
예제 출력 1
3 0 0 1 2 0 0 2
나의 풀이
이 문제를 푸는데 바보같은 짓을 했다...ㅋㅋㅋ 이진 탐색 단계의 문제라 무조건 이걸 이진탐색으로 풀려고 하다가 이상한 짓을 했다. 입력을 받아 딕셔너리에도 넣어주면서 아래 탐색하려는 값을 이진탐색하여 그 결과가 있으면 딕셔너리에서 값을 반환했다.. 역시나 TLE였다...ㅋㅋㅋㅋㅋ 그냥 이진 탐색도 쓸거없이 딕셔너리에만 넣고 있는지 없는지 여부에 따라 있으면 값을 출력해주고 없으면 0을 출력해주면 되는 문제였다...
그래도 검색을 해보니 일반적인 이진탐색말고 upper_bound와 under_bound를 찾아내서 개수를 찾아내는 방법도 있었지만 이러한 <key,value>구조를 사용하면 아주 쉽게 풀 수 있는 문제였다.
찾으려는 값이 딕셔너리에 키값으로 있는지를 확인하기 위해서는
dict.keys()
를 사용해서 키들을 불러오고in
연산자를 사용하여 있는지 없는지를 찾아냈다.
코드
# 10816번 숫자 카드 2
import sys
# main
n = int(sys.stdin.readline())
arr_dict = {}
for num in sys.stdin.readline().split():
num = int(num)
keys = arr_dict.keys()
if num in keys:
arr_dict[num] += 1
else:
arr_dict[num] = 1
m = int(sys.stdin.readline())
target = [int(x) for x in sys.stdin.readline().split()]
for t in target:
if t in keys:
print(arr_dict[t], end=' ')
else:
print(0, end=' ')
print()
'Programming > Algorithm' 카테고리의 다른 글
[백준2805번] 나무 자르기 / Python3 (0) | 2020.02.12 |
---|---|
[백준1654번] 랜선 자르기 / Python3 (0) | 2020.02.12 |
[백준1920번] 수 찾기 / Python3 (0) | 2020.02.11 |
[백준11505번] 구간 곱 구하기 / Python3 (0) | 2020.02.11 |
[백준2042번] 구간 합 구하기 / Python3 (0) | 2020.02.10 |