반응형
해당 포스팅의 문제의 출처는 나동빈님의 이것이 취업을 위한 코딩 테스트 교재를 공부하면서 풀이할 때 본인의 사고 과정 흐름과 문제 풀이를 기록하기 위함 입니다.

문제설명
고정점이란, 수열의 원소 중에서 그 값이 인덱스와 동일한 원소를 의미한다. 예를 들어 수열 a = [-15, -4, 2, 8, 13]이 있을 때, a[2] = 2이므로, 고정점은 2가 된다. 하나의 수열이 N개의 서로 다른 원소를 포함하고 있으며, 모든 원소가 오름차순으로 정렬되어 있다. 이 때 이 수열에서 고정점이 있다면, 고정점을 출력하는 프로그램을 작성해라. 고정점은 최대 1개만 존재한다. 만약 고정점이 없다면 -1을 출력한다. 단, 이 문제는 시간 복잡도 O(logN)으로 알고리즘을 설계하지 않으면 '시간 초과' 판정을 받는다.
입력조건
- 첫째 줄에 N이 입력된다.(1 <= N <= 1,000,000)
- 둘째 줄에 N개의 원소가 정수 형태로 공백으로 구분되어 입력된다.(−109 <= 원소의 값 <= 109)
출력조건
- 고정점을 출력한다. 고정점이 없다면 -1을 출력한다.
사고과정
- 문제에서 '모든 원소가 오름차순으로 정렬되어 있다'라는 포인트와 시간 복잡도 O(logN)으로 설계하지 않으면 안된다는 포인트 2개로 이진 탐색을 쉽게 떠올렸다. 그런데 특이한 점은 이진 탐색할 때, 탐색할 target 값이 중간(middle) 인덱스와 같은 경우를 출력하는 점이었다.
- 매번 이진 탐색 native python 소스 코드를 구현했던 점이 이진 탐색 로직을 쉽게 작성할 수 있게 했다. 단, 이진 탐색 시 어떨 때, 어느 방향을 선택해야 하는지, 즉, 예를 들어, 중간 인덱스와 탐색한 값 대소 비교 경우에 따라 왼쪽, 오른쪽 방향으로 움직이어야 하는지 알아내기 위해 입력 예시 데이터를 활용해 연습장에 그려보고 눈치를 챘다. 결국 array[mid_idx] < mid_idx 일 때는 오른쪽 즉, start_idx = mid_idx + 1 이고 array[mid_idx] < mid_idx 인 경우엔 왼쪽 즉, end_idx = mid_idx - 1 이어야 한다는 것을 알아냈다. 나중에 잘 생각해보니, 어차피 오름차순 정렬되어 있기 때문에 인덱스 값이 현재 탐색한 값보다 더 '크다'는 것은 타겟값과 인덱스가 똑같은 즉, 우리가 찾으려는 최종 값은 현재 탐색한 값보다 배열 순서 상으로 뒤에 있다는 걸 추측할 수 있기 때문에 오른쪽(start_idx = mid_idx + 1)으로 가야 한다는 것을 알 수 있다!
- 필자는 while문을 활용해서 구현했는데, 책 속에서는 재귀함수를 활용해 구현하였다.
풀이
1. 나의 풀이
import sys
N = int(input())
array = list(map(int, input().split()))
start = 0
end = N-1
def binary_search(array, start, end):
while start <= end:
mid = (start + end) // 2
if array[mid] == mid:
return mid
elif array[mid] < mid:
start = mid + 1
else:
end = mid - 1
return '-1'
res = binary_search(array, start, end)
print(res)
2. 책의 풀이
import sys
N = int(input())
array = list(map(int, input().split()))
start = 0
end = N-1
def binary_search(array, start, end):
if start > end:
return '-1'
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)
res = binary_search(array, start, end)
print(res)
반응형
'알고리즘 삽질장' 카테고리의 다른 글
[이코테] 그래프 알고리즘 - 팀 결성 (0) | 2021.09.30 |
---|---|
[이코테] 다이나믹프로그래밍 - 금광 (0) | 2021.09.29 |
[이코테] 정렬 - 실패율 (0) | 2021.09.28 |
[이코테] 정렬 - 안테나 (0) | 2021.09.28 |
[이코테] DFS - 연구소 (0) | 2021.09.27 |