Problem Solving/이것이 코딩테스트다

이코테 - Ch15. 고정점 찾기 (이진탐색)

파피 2021. 7. 13. 18:57

#1. 설계 및 풀이

 

# 고정점 찾기

'''
입) n (1이상 백만이하)
n개의 원소 (원소의 값은 -10억이상 10억 이하)

출) 고정점 출력, 없으면 -1 출력

-고정점이란 그 값이 인덱스와 동일한 원소, 최대 1개만 존재

-서로 다른 원소를 포함한 수열이 오름차순으로 정렬되어있음

-O(logN)으로 설계

# 설계

이진탐색

값이 인덱스보다 작으면 인덱스가 큰 값에 대해 이진탐색 수행
값이 인덱스보다 크면 인덱스가 작은 값에 대해 이진탐색 수행

'''
import sys
input = sys.stdin.readline

n = int(input().rstrip())
arr = list(map(int, input().rstrip().split()))

ans = -1
start, end = 0, n-1

while start <= end :
    mid = (start + end) // 2

    if arr[mid] == mid :
        ans = mid
        break

    elif arr[mid] < mid :
        start = mid+1

    else :
        end = mid - 1

print(ans)

 

 

#2. 개선할 점

 

- 재귀로도 풀 수 있다.

 

# 고정점 찾기

import sys
input = sys.stdin.readline

def binary_search(arr, start, end) :

    if start > end :
        return -1

    mid = (start + end) // 2

    if arr[mid] == mid :
        return mid

    elif arr[mid] < mid :
        return binary_search(arr, mid+1, end)

    else :
        return binary_search(arr, start, mid-1)

    

n = int(input().rstrip())
arr = list(map(int, input().rstrip().split()))


print(binary_search(arr, 0, n-1))