# 이진탐색 사용해서 풀기
N = int(input()) # 숫자 카드 개수
cards = sorted(list(map(int, input().split()))) # 숫자 카드 리스트
M = int(input()) # 찾아야할 숫자 개수
nums = list(map(int, input().split())) # 찾아야할 숫자 리스트
num_dict = {}
for n in cards: # 갖고 있는 카드들을 딕셔너리에 추가. 리스트에 있는 개수만큼 value를 더한다.
if n in num_dict:
num_dict[n] += 1
else:
num_dict[n] = 1
# 이진탐색 함수
def binary(target, cards, start, end):
if start > end: # 시작값이 끝값보다 크면 찾을수없으니 0 리턴
return 0
mid = (start + end) // 2 # 중간값을 구함
if target == cards[mid]: # 찾는값이 중간값과 일치하면 해당 값을 리턴
return num_dict[target]
elif target < cards[mid]: # 찾는값이 중간값보다 작으면 시작부터 중간-1로 범위를 좁힘
return binary(target, cards, start, mid - 1)
else: # 찾는 값이 중간값보다 크면 중간+1부터 끝값으로 범위를 좁힘
return binary(target, cards, mid + 1, end)
# 찾아야할 숫자 리스트만큼 반복
for num in nums:
print(binary(num, cards, 0, len(cards) - 1), end=' ')
# dictionary 사용해서 풀기
N = int(input()) # 숫자 카드 개수
cards = sorted(list(map(int, input().split()))) # 숫자 카드 리스트
M = int(input()) # 찾아야할 숫자 개수
nums = list(map(int, input().split())) # 찾아야할 숫자 리스트
num_dict = {}
for n in cards: # 갖고 있는 카드들을 딕셔너리에 추가. 리스트에 있는 개수만큼 value를 더한다.
if n in num_dict:
num_dict[n] += 1
else:
num_dict[n] = 1
for i in nums: # 찾아야할 숫자들만큼 반복
if i in num_dict: # 찾아야할 숫자가 딕셔너리에 있다면 해당 개수 출력
print(num_dict[i], end=' ')
else:
print(0, end=' ')
처음에는 딕셔너리를 이용해서 푼 문제였다. 나중에 알고리즘 분류를 보고 또 다른 블로그들을 찾아보니 이진탐색으로도 풀 수 있어서 재귀함수를 사용해 이진탐색 풀이도 구현해보았다.
https://www.acmicpc.net/problem/10816
10816번: 숫자 카드 2
첫째 줄에 상근이가 가지고 있는 숫자 카드의 개수 N(1 ≤ N ≤ 500,000)이 주어진다. 둘째 줄에는 숫자 카드에 적혀있는 정수가 주어진다. 숫자 카드에 적혀있는 수는 -10,000,000보다 크거나 같고, 10,0
www.acmicpc.net
'study > Algorithm' 카테고리의 다른 글
[백준] 파이썬 24313 : 알고리즘 수업 - 점근적 표기 1 (0) | 2024.03.30 |
---|---|
[백준] 파이썬 15649 : N과 M (1) (0) | 2024.03.30 |
[백준] 파이썬 24267 : 알고리즘의 수행시간 6 (0) | 2024.03.30 |
[백준] 파이썬 24265 : 알고리즘 수업 - 알고리즘의 수행 시간 4 (0) | 2024.03.30 |
[백준] 파이썬 11478번 : 서로 다른 부분 문자열의 개수 (0) | 2024.03.28 |