오름차순으로 정렬되어 있는 배열에서 target보다 큰 값들 중 가장 작은 값을 찾는 문제입니다.
정렬되어 있는 배열에서 찾는 문제이기에 이진탐색을 사용했습니다.
이진탐색은 정렬된 배열에서 Linear Search보다 빠르게 탐색 가능합니다.
target보다 작거나 같으면 찾는 값이 아니므로 제외합니다.
l = mid + 1;
target보다 크면 정답이 될 수 있는데 그 중 가장 작은 값을 찾는 문제이므로 그 뒤는 제외해주어도 됩니다.
r = mid
이렇게 l과 r의 값이 같아지면 while loop가 종료되고 이 index의 값이 target보다 크면 배열에 있는 target보다 큰 값 중에서 가장 작은 값이 되지만 아니라면 배열에는 target보다 큰 값이 없는 것 입니다.
char nextGreatestLetter(vector<char>& letters, char target) {
int l = 0, r = letters.size() - 1;
while (l < r) {
int mid = l + (r - l) / 2;
cout << letters[mid] << " " << target << " " << l << " " << r << endl;
if (letters[mid] <= target) // target보다 작거나 같으면 제외
l = mid + 1;
else {
r = mid;
}
}
if (letters[r] > target)
return letters[r];
return letters[0];
}
위의 코드는 좀 더 정리했습니다.
target보다 크다는 의미는 정답이 될 수 있다는 의미이므로 mid index의 값이 target보다 크면 정답으로 임시 저장한 뒤 mid index부터 제외한 뒤 탐색을 계속 이어가는 방식입니다.
char nextGreatestLetter(vector<char>& letters, char target) {
int l = 0, r = letters.size() - 1;
char min = letters[0];
while (l <= r) {
int mid = l + (r - l) / 2;
if (letters[mid] <= target) // target보다 작거나 같으면 제외
l = mid + 1;
else { // target보다 크면
min = letters[mid]; // 정답이 될 수 있으므로 저장
r = mid - 1;
}
}
return min;
}
'Algorithm 문제풀이 > Leetcode' 카테고리의 다른 글
(Easy - DFS) Leetcode - 100. Same Tree (0) | 2024.06.23 |
---|---|
(Easy - Dynamic Programming) Leetcode - 338. Counting Bits (0) | 2024.06.22 |
(Easy - Binary Search) Leetcode - 704 : Binary Search (0) | 2024.06.20 |
(Easy - Backtracking) Leetcode - 257. Binary Tree Paths (0) | 2024.06.20 |
(Easy - BFS) Leetcode - 111. Minimum Depth of Binary Tree (0) | 2024.06.19 |