inflearn logo
강의

강의

N
챌린지

챌린지

멘토링

멘토링

N
클립

클립

로드맵

로드맵

지식공유

세계 대회 진출자가 알려주는 코딩테스트 A to Z (with Python)

이분 탐색 알고리즘 [문제풀이] : BOJ 3020

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

해결된 질문

171

gogo_

작성한 질문수 2

0

해당 부분에 대해서 좀더 자세한 설명 부탁드리겠습니다.

python 코딩-테스트 알고리즘

답변 2

1

gogo_

자세히 설명해주셔서 정말 감사합니다

1

알리 Ally

안녕하세요, gogo_님!

 

get_idx(arr, h) 함수는 높이가 h이하인 값 중에서 가장 오른쪽 인덱스를 반환하는 함수입니다. 예를 들어 arr = [1, 2, 3, 3, 3, 4, 4, 5]이고 h=3인 경우에 get_idx(arr, h)는 인덱스 4를 반환하는 것이죠.

이제, 이러한 함수를 이용해서 천장에 있는 장애물과 바닥에 있는 장애물의 파괴해야 하는 개수를 각각 어떻게 계산하는지 예시를 통해서 자세히 알아보겠습니다.

 

h = 4

bots = [1, 3, 3, 4, 4, 5, 7, 7]

tops = [2, 2, 3, 4, 4, 5, 5, 7]

 

[바닥]

먼저, h=4이므로 바닥에서는 [4, 4, 5, 7, 7] 총 5개의 장애물을 파괴하는데요. 이는 get_idx(bots, h - 1)를 이용해서 구할 수 있습니다. get_idx(bots, h - 1)을 하게 되면 높이가 3이하인 값 중에서 가장 오른쪽 인덱스를 반환하게 되며, 따라서 인덱스 2를 반환하는 것이죠.

이렇게 반환된 2가 가지는 의미는 무엇일까요? 바로, h = 4일 때, 인덱스 0, 1, 2인 장애물은 파괴되지 않았다는 것인데요! 즉, get_idx(bots, h - 1)이 2이므로 bots에 있는 8개의 장애물 중에서 3개의 장애물은 파괴되지 않았다는 것이며, 이는 5개의 장애물이 파괴되었다는 것입니다.
get_idx()함수는 인덱스를 반환하므로 개수를 셀 때는 1을 더해줘야 한다는 점을 주의하자. 즉, 파괴되지 않은 장애물의 개수는 get_idx(bots, h - 1)이 아닌 get_idx(bots, h - 1) + 1인 것이다.

이를 코딩에서 사용할 수 있게끔 쓰면 h일 때 파괴되는 장애물의 개수는 len(bots) - (get_idx(bots, h - 1) + 1) 과 같이 쓸 수 있는 것이죠.

강의 자료에 나온 코드에서는 len(bots) 대신에 N / / 2로 썼으며, 둘은 똑같은 값을 의미합니다.

 

[천장]

비슷하게, 천장에서 파괴해야 하는 장애물의 개수를 구해봅시다. 천장에서는 장애물 [2, 2, 3, 4, 4] 을 파괴하는데요. 이는 높이가 4이하인 장애물의 개수를 세면 되는데요. 따라서, get_idx(tops, h)를 이용하면 됩니다. get_idx(tops, h)를 하게 되면, 높이가 4이하인 값 중에서 가장 오른쪽 인덱스를 반환하므로 4를 반환하게 되는데요.

이렇게 반환된 4가 의미하는 것이 무엇일까요? 바로, h = 4일 때, 인덱스 0, 1, 2, 3, 4인 장애물이 파괴됐다는 건데요! 따라서, h = 4일 때 파괴된 장애물의 개수는 5개인 것이죠.

이를 코딩에서 사용할 수 있게끔 쓰면 h일 때 파괴되는 장애물의 개수는 get_idx(tops, h) + 1 과 같이 쓸 수 있는 것이죠.

 

정리하면, 1을 더하는 이유는 get_idx() 함수는 인덱스를 반환하는 함수이고, 저희는 개수를 세야 하므로 반환된 인덱스에 1을 더해준다고 생각해주시면 될 것 같습니다.

 


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

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

5점 수강평을 남겨주시면 향후 더 나은 강의를 만드는 데 큰 도움이 됩니다. 🌟

Iterable 관련 설명 중 의문점

1

71

1

DP 알고리즘 index 0 이유?

0

80

2

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

0

78

2

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

1

79

2

BFS, DFS

0

102

2

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

0

98

1

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

0

110

2

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

0

269

2

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

0

87

3

라이브러리 사용

0

118

2

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

0

167

1

브루트 포스 풀이

0

144

2

다익스트라 음수 간선

0

158

1

종료 조건

0

117

2

BOJ 1342 메모리초과 관련

0

122

2

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

0

214

1

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

0

150

2

boj 3020

0

127

1

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

0

155

1

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

1

260

2

DP 11053관련 질문있습니다.

0

120

1

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

0

138

3

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

0

197

1

실전 문제풀이 관련 질문

0

117

1