728x90
문제
n개의 숫자가 주어지고, q개의 질문이 주어진다. 각각의 질문은 n개의 숫자 중에서 특정 숫자가 몇개나 있는지를 묻는다. q개의 질문에 모두 답하는 프로그램을 작성하시오.
입력
첫 번째 줄에 숫자의 개수 n, 그리고 질문의 개수 q가 주어진다 ( 1 ≤ n ≤ 100,000, 1 ≤ q ≤ 100,000) 두 번째 줄에 n개의 숫자가 주어진다. 세 번째 줄에 q개의 질문이 주어진다. 주어지는 q개의 질문에 해당하는 숫자 범위는 100,000,000이하이다.
출력
각 질문에 대하여 숫자의 개수를 한 줄에 하나씩 출력한다.
예제 입력
10 4
1 3 4 3 2 3 1 2 5 10
1 3 9 10
예제 출력
2
3
0
1
# 코드
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
|
# 입력받기
n, q = map(int, input().split())
n, q = int(n), int(q)
data_list = list(map(int, input().split()))
nQ = list(map(int, input().split()))
# 가공
# 1. 중복제거(키) : 중복횟수(값) 형태로 저장한다. ex) 1:2, 2:2, 3:3 이런 형태로..
frame = {}
for i in range(len(data_list)):
try : frame[data_list[i]] += 1
except : frame[data_list[i]] = 1
# 2. data_list에 중복 값을 제거하여 저장한다.
set_frame = set(data_list)
data_list = list(set_frame)
data_list.sort()
# 3. 이진탐색 함수
def binary_search(data, search):
if len(data) == 1 and search == data[0]:
return True
if len(data) == 1 and search != data[0]:
return False
if len(data) == 0:
return False
medium = len(data)//2
if search == data[medium]:
return True
else:
if search > data[medium]: # 찾고자 하는 값 search값이 data[medium]보다 큰 경우
return binary_search(data[medium+1:], search) #중간 기준 오른쪽
else: # 찾고자 하는 값 search값이 data[medium]보다 작은 경우
return binary_search(data[:medium], search) #중간 기준 왼쪽
for i in range(len(nQ)):
getRes = binary_search(data_list, nQ[i])
if getRes == True: # True이면 값이 존재한다는 뜻 : frame 딕셔너리에서 해당 value가져오기
print(frame.get(nQ[i]))
else:
print(0) # False이면 값이 존재하지 않다는 뜻 : 0을 출력한다.
|
cs |
반응형
'CS > 알고리즘_문제풀이(파이썬)' 카테고리의 다른 글
단순 밀기 (0) | 2021.05.23 |
---|---|
NN단표 (0) | 2021.05.21 |
inequal(백트래킹) (0) | 2021.05.17 |
division(백트래킹) (0) | 2021.05.17 |
순열구하기(백트래킹) (0) | 2021.05.17 |