반응형

이것이 코딩테스트다 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)
반응형
  • 네이버 블러그 공유하기
  • 네이버 밴드에 공유하기
  • 페이스북 공유하기
  • 카카오스토리 공유하기