이것이 코딩테스트다 with 파이썬 교재 368P에 있는 Chapter15 이진 탐색 문제중 두번째 문제입니다.
문제 :
고정점(Fixed Point)이란, 수열의 원소 중에서 그 값이 인덱스와 동일한 원소를 의미합니다. 예를 들어 수열 a = {-15, -4, 2, 8, 13}이 있을 때 a[2] = 2 이므로 고정점은 2가 됩니다.
하나의 수열이 N개의 서로 다른 원소를 포함하고 있으며, 모든 원소가 오름차순으로 정렬되어 있습니다. 고정점은 최대 1개만 존재합니다. 만약 고정점이 없다면 -1을 출력합니다.
단, 이 문제는 시간 복잡도 O(logN)으로 알고리즘을 설계하지 않으면 '시간 초과' 판정을 받습니다.
입력 조건 :
- 첫째 줄에 N이 입력됩니다. (1 <= N <= 1,000,000)
- 둘째 줄에 N개의 원소가 정수 형태로 공백으로 구분되어 입력됩니다. (-10^9 <= 각 원소의 값 <= 10^9)
출력 조건 :
- 고정점을 출력한다. 고정점이 없다면 -1을 출력합니다.
입력 예시 1 : 출력 예시 1 :
5 3
-15 -6 1 3 7
입력 예시 2 : 출력 예시 2 :
7 2
-15 -4 2 8 9 13 15
입력 예시 4 : 출력 예시 3 :
7 -1
-15 -4 3 8 9 13 15
선형 탐색으로 문제에 접근하면 시간초과가 발생하기 때문에 이진 탐색을 이용하여 접근해야합니다.
import sys
n = int(sys.stdin.readline().rstrip())
a = list(map(int, sys.stdin.readline().rstrip().split()))
# 이진 탐색
def Binary_Search(array,start,end) :
if start > end :
return 0
# mid와 a[mid]가 동일하면 중간값
mid = (start+end) // 2
# 고정점을 발견한 경우 고정점 반환
if array[mid] == mid :
return mid
elif array[mid] < mid :
return Binary_Search(array,mid+1,end)
else :
return Binary_Search(array,start,mid-1)
# 0 부터 a의 끝까지 이진 탐색을 시작
# a에 고정점이 없다면 check에 0을 반환
# 고정점이 있다면 고정점을 반환
check = Binary_Search(a,0,n-1)
# 고정점이 없다면 -1을 출력
if (check == 0) :
print(-1)
# 고정점이 있다면 고정점을 출력
else :
print(check)
'알고리즘 문제풀이[Algorithm]' 카테고리의 다른 글
[백준] 2512번 예산(파라메트릭 서치)(Python - 파이썬) (0) | 2022.01.27 |
---|---|
[백준] 10825번 국영수(Lambda를 이용하여 정렬)(Python - 파이썬) (0) | 2022.01.25 |
[백준] 10816번 숫자 카드 2(Python - 파이썬) (0) | 2022.01.22 |
[백준] 18310번 안테나(Python - 파이썬) (0) | 2022.01.18 |
[백준] 2589번 보물섬(BFS알고리즘)(Python - 파이썬) (0) | 2022.01.16 |
최근댓글