바위타는 두루미

8.3 마술인덱스 본문

Study/Interview준비

8.3 마술인덱스

DoRoMii 2019. 8. 4. 18:25
728x90

문제

배열 A[0 ... n-1]에서 A[i] = i  인 인덱스를 마술 인덱스(magic index)라고 한다. 정렬된 상태의 배열이 주어졌을때 마술 인덱스가 존재한다면 그 값을 찾는 메서드를 만들어라.

 

해결법

가장 무식하고 간단하게 푸는 방법은 0부터 순환하면서 해당하는 index가 있는지 확인하는 것이다.

하지만 정렬된 데이터라는 점에서 이진 탐색 으로 문제를 해결 할 수 있을 것 같다. 

중복된 데이터가 없다는 가정하에는 

-40 -20 -1 1 3 5 7 9 12
0 1 2 3 4 5 6 7 8 9

이러한 데이터가 있다고 보자 

A[5] = 3 A[mid] < mid 이므로 마술인덱스는 오른쪽에 있음을 알 수 있다. 

정말 왼쪽에 있을 수는 없을까? i에서 i-1로 움직인다고 가정해보자. 이 때 배열의 원소값도 적어도 1만큼 감소한다. 

따라서 원소의 값이 이미 index보다 작다면 index가 k만큼 작아질때 원소 값도 적어도 k만큼 적어지므로 절대 같아 질 수 없다. 

재귀로 코드를 작성해보자

def Solution(array):
    return findMagicIndex(array, 0, len(array)-1)

def findMagicIndex(array, l, r):
    if l > r :
        return -1
    mid = (l + r) / 2
    if mid == array[mid]:
        return mid
    elif mid < array[mid]:
        return findMagicIndex(array, l, mid-1)
    else :
        return findMagicIndex(array, mid+1, l)

반복적으로 연산하는 방법으로 해결해보자 

def Solution(array):
    
    l , r = 0 , len(array)-1
    while l <= r :
        mid = (l + r) / 2
        if mid == array[mid]:
            return mid
        elif mid < array[mid]:
            r = mid -1
        else :
            l = mid +1
    return -1

'Study > Interview준비' 카테고리의 다른 글

8.5 재귀 곱셈  (0) 2019.08.04
8.4 부분집합  (0) 2019.08.04
8.1 트리플 스텝  (0) 2019.08.04
[개념정리] 수학 및 논리 퍼즐  (0) 2019.08.04
5.8 선그리기  (0) 2019.08.03
Comments