바위타는 두루미

10.11 Peak과 Valley 본문

Study/Interview준비

10.11 Peak과 Valley

DoRoMii 2019. 8. 7. 14:51
728x90

문제 

정수 배열에서 peak란 현재 원소가 인접한 정수보다 크거나 같을 때를 말하고, 'valley'란 현재 원소가 인접한 정수보다 작거나 같을 때를 말한다. 예를 들어 {5,8,6,2,3,4,6}이 있으면, {8,6}은  peak고 {5,2}는 valley인 것이다. 

정수배열이 주어졌을때 'peak'와 'valley'가 번갈아 등장하도록 정렬하는 알고리즘을 작성하라.

 

해법

1. 부분 최적 해법

 배열을 정렬하고 위치를 바꿈으로써 peak와 valley를 순차적으로 나올 수 있도록 만들 수 있을 것이다.

정렬된 배열 0 1 4 7 8 9 가 있다고 하자. 

0은 올바른 위치고 

1은 잘못 놓였다 0과 4중에 자리를 바꿀 수 있으나 0와 바꿔보자 

7도 잘못 놓였다. 4과 8중에 자리를 바꿀 수 있으나 4과 바꿔보자 

9도 잘못 놓였다 8과 자리를 바꿀 수 있으니 8과 바꿔보자 

그러면 0 4 1 8 7 9로 peak와 valley가 번갈아 나타나는 배열이 나타난다.

이 알고리즘의 TimeComplexity = O(NlogN)이다.

def sortValleyPeak(array):
    array.sort()
    for i in range(1,len(array)):
        array[i] , array[i+1] = array[i+1] , array[i]

2. 최적 해법

저 알고리즘보다 더 최적이되려면 정렬을 하지 말아야한다. 

그냥 배열을 가지고는 peak와 valley가 번갈아 나오도록 만들 수 없는 걸까?

9 1 0 4 8 7 이라는 배열이 있다고 가정하자.

그전에 더 짧은 배열을 통해 규칙을 확인해보자 

0 1 2 라는 배열이 있을때 

0 2 1  ->peak

1 0 2

1 2 0  ->peak

2 1 0 

2 0 1

나머지 배열도 수정해서 peak가 되게 할 수 있을까?

가운데 원소와 인접한 원소 중에 가장 큰수와 바꾸면 된다.

"두 원소를 맞바꿨을때 이전에 처리했던 수열의 규칙이 깨지는 경우가 있지는 않을까?" -> 이문제에서 중간값과 왼쪽 값을 바꾼다고 했을때 왼쪽값은 여전히 valley일 것이다 중간 값이 왼쪽 값보다 작으므로 더 작은 수를 놓게 되기 때문이다. 

def bigIndex(array, a,b,c):
    len_a = len(array)
    a = array[a] if a>=0 and a < len_a else - int('inf')
    b = array[b] if b>=0 and b < len_a else - int('inf')
    c = array[c] if c>=0 and c < len_a else - int('inf')

    max_num = max(a,b,c)
    if array[a] == max_num :
        return a
    elif array[b] == max_num :
        return b
    else :
        return c

 

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

10.10 스트림에서의 순위  (0) 2019.08.07
10.9 정렬된 행렬 탐색  (0) 2019.08.07
10.7 빠뜨린 정수  (0) 2019.08.06
10.6 큰 파일 정렬  (0) 2019.08.06
10.5 드문드문 탐색  (0) 2019.08.06
Comments