문제
숫자 카드는 정수 하나가 적혀져 있는 카드이다. 상근이는 숫자 카드 N개를 가지고 있다. 정수 M개가 주어졌을 때, 이 수가 적혀있는 숫자 카드를 상근이가 가지고 있는지 아닌지를 구하는 프로그램을 작성하시오.
https://www.acmicpc.net/problem/10815
10815번: 숫자 카드
첫째 줄에 상근이가 가지고 있는 숫자 카드의 개수 N(1 ≤ N ≤ 500,000)이 주어진다. 둘째 줄에는 숫자 카드에 적혀있는 정수가 주어진다. 숫자 카드에 적혀있는 수는 -10,000,000보다 크거나 같고, 10,
www.acmicpc.net
import sys
N=int(sys.stdin.readline())
num_list=list(map(int,sys.stdin.readline().split()))
M=int(sys.stdin.readline())
check_list=list(map(int,sys.stdin.readline().split()))
check_result=[]
num_list.sort()
def bin_search(num,start,end):
global num_list
if(start>end):
return False
else:
mid=(start+end)//2
if(num_list[mid]==num):
return True
if(num_list[mid]>num):
return bin_search(num,start,mid-1)
if(num_list[mid]<num):
return bin_search(num,mid+1,end)
for x in check_list:
result=bin_search(x,0,N-1)
if(result==True):
check_result.append(1)
elif(result==False):
check_result.append(0)
print(*check_result)
※ 집합과 맵
시간초과를 방지하기 위해 이진 탐색을 이용하여 문제를 해결한다.
● 먼저 가지고 있는 숫자카드의 숫자를 num_list 배열에 저장한 후, sort() 함수를 통해 오름차순 정렬한다.
● 그 후 존재 유무를 확인해야 할 숫자들을 check_list 배열에 저장한다.
● 모든 check_list안의 요소들에 대해 bin_search() 라는 함수를 정의하여 이진탐색을 진행한다. 이 때 처음 bin_search를 진행하는 범위는 num_list 배열의 처음부터 끝까지이다.
bin_search() 는 현재 찾아야 할 수, 탐색해야하는 배열 범위의 첫 인덱스와 마지막 인덱스를 매개변수로 갖는다.
● 탐색해야 하는 배열 범위의 첫 인덱스가 마지막 인덱스보다 큰 값을 가지게 되면 그때까지 찾아야 하는 수를 못 찾은 것이므로 False를 return 해준다.
● 탐색해야 하는 배열 범위의 첫 인덱스가 마지막 인덱스보다 작거나 같은 값을 가지면 탐색해야 하는 배열 범위의 중간 인덱스를 mid 변수에 저장한다.
● 그 후 mid 값을 인덱스로 하는 요소의 값이 현재 찾아야 할 수와 같으면 그 수를 찾은 것이므로 True를 return 해준다.
● 만약 mid 값을 인덱스로 하는 요소의 값이 현재 찾아야 할 수보다 크면, 배열 인덱스의 범위를 현재 배열 범위의 처음부터 mid 값을 인덱스로 하는 요소 바로 전까지 다시 탐색하도록 범위를 설정하여 bin_search() 함수를 호출해준다.
● 또한 mid 값을 인덱스로 하는 요소의 값이 현재 찾아야 할 수보다 작으면, 배열 인덱스의 범위를 mid 값을 인덱스로 하는 요소 바로 다음 요소부터 현재 배열 범위의 끝까지 다시 탐색하도록 범위를 설정하여 bin_search() 함수를 호출해준다.
● 그 후, 탐색을 수행한 값이 True가 나오면 check_result 라는 배열에 1을 append, False가 나오면 0을 append 해준 뒤, check_result 배열을 출력해주면 된다!!
♣ 참고: 이진탐색
https://namu.wiki/w/%EC%9D%B4%EC%A7%84%20%ED%83%90%EC%83%89
이진 탐색 - 나무위키
이 저작물은 CC BY-NC-SA 2.0 KR에 따라 이용할 수 있습니다. (단, 라이선스가 명시된 일부 문서 및 삽화 제외) 기여하신 문서의 저작권은 각 기여자에게 있으며, 각 기여자는 기여하신 부분의 저작권
namu.wiki
'백준(baekjoon) > 실버' 카테고리의 다른 글
백준(baekjoon) 11478번: 서로 다른 부분 문자열의 개수(실버 3, 파이썬 PYTHON) - 집합과 맵 (0) | 2022.09.06 |
---|---|
백준(baekjoon) 1269번: 대칭 차집합(실버 4, 파이썬 PYTHON) - 집합과 맵 (0) | 2022.09.06 |
백준(baekjoon) 18870번: 좌표 압축(실버 2, 파이썬 PYTHON) - 정렬 (0) | 2022.09.05 |
백준(baekjoon) 2108번: 통계학(실버 3, 파이썬 PYTHON) - 정렬 (0) | 2022.09.05 |
백준(baekjoon) 2751번: 수 정렬하기 2 (실버 5, 파이썬 PYTHON) - 정렬 (0) | 2022.09.04 |