inflearn logo
강의

講義

知識共有

世界大会進出者が教えるコーディングテスト A to Z (with Python)

二分探索アルゴリズム [概念]

2번 구현 방법 질문 있습니다.

解決済みの質問

167

eoyeong

投稿した質問数 57

0

안녕하세요.

 

12:40초 경에 찾는 숫자가 배열에 있는지 확인하는 함수를 2번 방법으로 구현할 때

찾는 숫자 : 1, 배열 : arr = [2, 3, 4, 5]

이런식으로 배열에 찾는 숫자보다 큰 값들만 있으면

cur이 -1이니까 arr[cur] == num에서 out of index 에러가 발생할 것 같은데

 

일반적인 이분탐색을 매개변수 탐색 방법으로 구현하려고 하면 cur = -1인 부분에 대해서는 따로 예외처리를 해주면 될까요?

아니면 좀 더 깔끔한 구현 방법이 있을까요?

 

 

python 코딩-테스트 알고리즘

回答 1

1

ally

안녕하세요, eoyeong님!

말씀하신 대로 cur = -1인 경우를 따로 예외처리하는 것도 좋은 방법입니다.

하지만, 저 같은 경우는 함수 내에서 cur에 대해 처리하는 것이 아닌 함수 밖에서 cur을 처리하는 방식을 선호합니다. 이와 관련한 내용은 아래에 적혀져 있습니다.

 

매개변수 탐색 더 잘 이용하기

일단 매개변수 탐색 형식으로 구현한 경우에 (숫자 K에 대해) 함수의 의미는 "배열의 원소 중에서 K인 값을 찾는다" 라는 의미보단 "배열의 원소 중에서 K보다 작거나 같은 가장 오른쪽 인덱스를 반환한다"라는 의미로 받아들이는 것이 좋습니다.

따라서, 저 같은 경우는 매개 변수 탐색 방법을 이용한다면, 예외처리 없이 cur을 반환하게 한 후에 cur을 처리하는 방식을 많이 사용합니다. (아래의 코드 참조)

def get_idx(arr, num): # arr[idx] ≤ num인 가장 큰 idx를 반환
    cur = -1
    step = len(arr)
    
    while step != 0:
        while (cur + step < len(arr) and arr[cur + step] <= num): 
            cur += step
        step //= 2
        
    return cur


arr = [1, 3, 3, 4, 5, 7, 9, 10, 11, 13, 13, 16]
num1 = -10
num2 = 6
num3 = 13

idx1 = get_idx(arr, num1)
# idx1은 -1이 나오게 된다. 즉, -10보다 작거나 같은 가장 오른쪽 인덱스가 -1이니 배열에 존재하지 않는다는 의미이다.
# 동시에, 배열에 -10보다 작거나 같은 원소가 없다는 의미이다. (= 배열의 모든 원소가 -10보다 크다는 의미)

idx2 = get_idx(arr, num2)
# idx2은 4가 나오게 된다. 즉, 6보다 작거나 같은 가장 오른쪽 인덱스가 4이다.
# 따라서 arr[0] ~ arr[idx2]는 6보다 작거나 같음을 만족하는 상태이다. (arr[idx2] < num2인 경우, 배열에 num2가 존재하지 않음.)

idx3 = get_idx(arr, num3)
# idx3는 10이 나오게 된다. 즉, 10보다 작거나 같은 가장 오른쪽 인덱스가 10이다.
# 따라서 arr[0] ~ arr[idx3]는 10보다 작거나 같음을 만족하는 상태이다. (arr[idx3] = num3인 경우, 배열에 num3가 존재함.)

위의 예시 코드에서 각 케이스 별로 뜻을 적어 놓았습니다. 함수의 의미가 "배열의 원소 중에서 K보다 작거나 같은 가장 오른쪽 인덱스를 반환한다"라는 점을 인지한다면 각 케이스마다 적어 놓은 의미가 당연하다는 생각이 드실 겁니다.
이를 활용하여 문제에 적용하는 더 디테일한 내용이 궁금하시면, 이분 탐색 알고리즘 [문제풀이] : BOJ 3020 강의의 2번째 풀이 코드를 참고하시면 좋을 것 같습니다.

 


질문에 대해 만족스러운 답변이 되었기를 바랍니다!

추가로 궁금하신 점이나 더 자세한 설명이 필요하시다면 언제든지 말씀해 주세요. 😄

1

eoyeong

상세한 답변 감사합니다 :)

Iterable 관련 설명 중 의문점

1

73

1

DP 알고리즘 index 0 이유?

0

80

2

백준에서 queue.PriorityQueue() 사용 시 런타임에러가 납니다.

0

78

2

(시간 초과) BOJ 1342 관련하여 질문이 있습니다

1

79

2

BFS, DFS

0

105

2

이중연결리스트에 관한 수업 내용도 있을까요?

0

98

1

영상에서 설명이 잘못됐고 자막이 맞는 내용이라고 자막에 표기

0

113

2

최대값 int(1e6, 1e7, 1e8) 기준

0

272

2

섹션 3 BOJ 1342 //= 연산자 관련

0

87

3

라이브러리 사용

0

118

2

브루트 포스 풀이

0

144

2

다익스트라 음수 간선

0

159

1

종료 조건

0

117

2

BOJ 1342 메모리초과 관련

0

123

2

진짜 엄청나네요. 이 가격에 새로운 컨텐츠 추가라니

0

215

1

섹션3 브루트포스 알고리즘 1342 풀이1 질문

0

151

2

boj 3020

0

127

1

강의 내용 중 백트래킹 존재 여부

0

156

1

제가 공부하는 방법이 괜찮은지 궁금합니다

1

261

2

DP 11053관련 질문있습니다.

0

120

1

17609 투포인터 문제를 재귀로 풀 경우가 궁금합니다!

0

138

3

3020번 풀이 코드관련 질문있어요

0

171

2

재귀 관련 문제 관찰할 때 질문

0

197

1

실전 문제풀이 관련 질문

0

118

1