본문 바로가기

Algorithm/BOJ

[BOJ] 1920. 수 찾기

https://www.acmicpc.net/problem/1920

 

1920번: 수 찾기

첫째 줄에 자연수 N(1 ≤ N ≤ 100,000)이 주어진다. 다음 줄에는 N개의 정수 A[1], A[2], …, A[N]이 주어진다. 다음 줄에는 M(1 ≤ M ≤ 100,000)이 주어진다. 다음 줄에는 M개의 수들이 주어지는데, 이 수들

www.acmicpc.net

 

 

1. 해결방법

"""
1. 아이디어
- M 배열을 for문 돌린다.
- 시간복잡도를 고려해서 N개의 배열을 정렬해서 이진탐색을 활용한다.

2. 시간복잡도
- O(NlogN)
"""

 

2. 정답코드

import sys
input = sys.stdin.readline

N = int(input())
nums = sorted(list(map(int, input().split())))
M = int(input())
targets = list(map(int, input().split()))


def search(start, end, tar):
    if start == end:
        if nums[start] == tar:
            print(1)
        else:
            print(0)
        return

    mid = (start + end) // 2
    if nums[mid] < tar:
        search(mid + 1, end, tar)
    else:
        search(start, mid, tar)


for target in targets:
    search(0, N - 1, target)
이 문제는 이진탐색의 기본이 되는 문제라고 보면된다. 
투포인터와 마찬가지로 시간복잡도를 판단하고 이진탐색을 써야하는 것을 알아야 한다. 이진 탐색을 사용하기 위해서는 배열의 정렬화도 매우 중요하다.

'Algorithm > BOJ' 카테고리의 다른 글

[BOJ] 1654. 랜선 자르기  (0) 2022.09.04
[BOJ] 10816. 숫자 카드2  (2) 2022.09.03
[BOJ] 2467. 용액  (0) 2022.09.02
[BOJ] 2003. 수들의 합2  (0) 2022.09.02
[BOJ] 3273. 두 수의 합  (0) 2022.09.01