티스토리 뷰
728x90
반응형
목차
이진 탐색
문제
N개의 정수 A[1], A[2], …, A[N]이 주어져 있을 때, 이 안에 X라는 정수가 존재하는지 알아내는 프로그램을 작성하시오.
입력
첫째 줄에 자연수 N(1 ≤ N ≤ 100,000)이 주어진다.
다음 줄에는 N개의 정수 A[1], A[2], …, A[N]이 주어진다.
다음 줄에는 M(1 ≤ M ≤ 100,000)이 주어진다.
다음 줄에는 M개의 수들이 주어지는데, 이 수들이 A안에 존재하는지 알아내면 된다.
모든 정수의 범위는 $-2^{31}$ 보다 크거나 같고 $2^{31}$보다 작다.
출력
M개의 줄에 답을 출력한다. 존재하면 1을, 존재하지 않으면 0을 출력한다.
풀이
이진 탐색의 첫 번째 문제이다. 이전 글에서 적은 이진 탐색의 예제와 사실상 같은 문제라 더 설명할 것은 없어 보인다.
코드 구현 알고리즘으로 바로 들어가자면 아래와 같이 진행된다.
- 크기가 n인 배열(리스트)를 입력받아 오름차순으로 정렬한다.
- 크기가 m인 배열(리스트)를 numbers에 저장한다.
- 결과를 저장할 문자열 result를 생성 및 초기화해준다.
- numbers의 각 요소 number를 순서대로 탐색하며 아래와 같이 이진 탐색을 진행한다.
- 존재여부를 저장할 isFound를 false로 초기화한다.
- 전체 구간 탐색을 위해 left = 0, right = n - 1로 초기화한다.
- left <= right인 동안 아래와 같은 탐색을 반복한다.
- 인덱스의 중간값 (left + right) / 2 를 mid에 배정한다.
- arr[mid]와 number의 값을 비교한 뒤
- arr[mid] == number → isFound를 true로 갱신하고 반복을 종료한다.
- arr[mid] < number → left를 mid + 1로 갱신한다.
- arr[mid] > number → right를 mid - 1로 갱신한다.
- 삼항 연산자를 사용해 isFound의 값에 따라 1 또는 0을 개행문자와 함께 result에 추가한다.
- result를 출력한다.
잘게 쪼개고 보니 길어 보이지만 이해나 구현 자체가 그리 어렵지는 않다.
Java
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.Arrays;
import java.util.StringTokenizer;
public class Prob1920 {
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
int n = Integer.parseInt(br.readLine());
int[] arr = new int[n];
StringTokenizer st = new StringTokenizer(br.readLine());
for (int i = 0; i < n; i++) {
arr[i] = Integer.parseInt(st.nextToken());
}
Arrays.sort(arr);
int m = Integer.parseInt(br.readLine());
int[] numbers = new int[m];
st = new StringTokenizer(br.readLine());
for (int i = 0; i < m; i++) {
numbers[i] = Integer.parseInt(st.nextToken());
}
StringBuilder result = new StringBuilder();
for (int number : numbers) {
boolean isFound = false;
int left = 0;
int right = n - 1;
while (left <= right) {
int mid = (left + right) / 2;
if (arr[mid] == number) {
isFound = true;
break;
} else if (arr[mid] < number) {
left = mid + 1;
} else {
right = mid - 1;
}
}
result.append(isFound? 1 : 0).append('\n');
}
System.out.println(result.toString());
}
}
Python
import sys
n = int(sys.stdin.readline().rstrip())
lst = list(map(int, sys.stdin.readline().rstrip().split(' ')))
lst = sorted(lst)
m = int(sys.stdin.readline().rstrip())
numbers = list(map(int, sys.stdin.readline().rstrip().split(' ')))
result = ''
for number in numbers:
isFound = False
left = 0
right = n - 1
while left <= right:
mid = (left + right) // 2
if lst[mid] == number:
isFound = True
break
elif lst[mid] < number:
left = mid + 1
else:
right = mid - 1
result += str(1 if isFound else 0) + '\n'
print(result)
Performance
반응형
'Algorithm > [Java+Python+JavaScript]BackJoon' 카테고리의 다른 글
[JavaScript]14681번, 사분면 고르기 (0) | 2023.06.24 |
---|---|
[Java+Python]2805번, 나무 자르기 (0) | 2023.06.23 |
[Java+Python]1654번, 랜선 자르기 (1) | 2023.06.22 |
[Java+Python]6549번, 히스토그램에서 가장 큰 직사각형 (0) | 2023.06.19 |
[Java+Python]11444번, 피보나치 수 6 (1) | 2023.06.17 |
[Java+Python]10830번, 행렬 제곱 (0) | 2023.06.14 |
댓글
공지사항
최근에 올라온 글
최근에 달린 댓글
- Total
- Today
- Yesterday
링크
TAG
- 야경
- 유럽여행
- a6000
- Backjoon
- 세모
- 알고리즘
- 백준
- RX100M5
- 자바
- spring
- 리스트
- 스프링
- Python
- 유럽
- BOJ
- 파이썬
- 스트림
- 칼이사
- 중남미
- 지지
- java
- 세계일주
- Algorithm
- 세계여행
- 남미
- 면접 준비
- 여행
- 기술면접
- 동적계획법
- 맛집
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
글 보관함