문제집 추천, 이 문제집에 나온 유형들만 공부해도 코딩테스트는 거뜬: https://www.acmicpc.net/workbook/by/BaaaaaaaaaaarkingDog
10816번: 숫자 카드 2 문제 보러 가기
10816번: 숫자 카드 2
첫째 줄에 상근이가 가지고 있는 숫자 카드의 개수 N(1 ≤ N ≤ 500,000)이 주어진다. 둘째 줄에는 숫자 카드에 적혀있는 정수가 주어진다. 숫자 카드에 적혀있는 수는 -10,000,000보다 크거나 같고, 10,0
www.acmicpc.net
관련 문제
1920번: 수 찾기
시간제한: 1초
메모리 제한: 256MB
문제
숫자 카드는 정수 하나가 적혀져 있는 카드이다. 상근이는 숫자 카드 N개를 가지고 있다. 정수 M개가 주어졌을 때, 이 수가 적혀있는 숫자 카드를 상근이가 몇 개 가지고 있는지 구하는 프로그램을 작성하시오.
출력
첫째 줄에 입력으로 주어진 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
이분 탐색으로 푸는 방법
import sys
sys.stdin=open('input.txt', 'r')
input = sys.stdin.readline
def binarySearch(arr, target, start, end):
if start > end: # 없으면 0을 return
return 0
mid = (start + end) // 2
if arr[mid] == target: # 원하는 숫자를 딱 마주하면
return count.get(target) # 그 숫자의 카드 개수가 몇개인지 get해서 return
elif arr[mid] < target:
return binarySearch(arr, target, mid+1, end)
else:
return binarySearch(arr, target, start, mid-1)
if __name__=="__main__":
N = int(input())
cards = sorted(list(map(int, input().split())))
M = int(input())
candidate = list(map(int, input().split()))
# 먼저 카드당 딕셔너리를 만들어준다
count = {}
for card in cards:
if card in count: # 이미 있으면 더해주고
count[card] += 1
else: # 처음만난 카드면 하나 만들어주고
count[card] = 1
# 매 타겟 숫자들을 이분탐색으로 찾아준다
for target in candidate:
start=0
end=N-1
print(binarySearch(cards, target, start, end), end=" ")
딕셔너리와 이분탐색과 재귀로 푼다.
bisect로 푸는 방법
import sys
from bisect import bisect_left, bisect_right
sys.stdin=open('input.txt', 'r')
def count_by_range(nums, lv, rv):
right_index = bisect_right(nums, rv)
left_index = bisect_left(nums, lv)
return right_index - left_index
if __name__=="__main__":
N=int(input())
cards = list(map(int, input().split()))
M=int(input())
targets=list(map(int, input().split()))
cards.sort()
for i in range(M):
print(count_by_range(cards, targets[i], targets[i]), end=' ')
Counter로 푸는 방법
import sys
from collections import Counter
sys.stdin=open('input.txt', 'r')
if __name__=="__main__":
N=int(input())
cards = list(map(int, input().split()))
M=int(input())
targets=list(map(int, input().split()))
count = Counter(cards)
for i in range(M):
if targets[i] in count:
print(count[targets[i]], end=' ')
else:
print(0, end=' ')