프로필사진

Go, Vantage point

가까운 곳을 걷지 않고 서는 먼 곳을 갈 수 없다.


Github | https://github.com/overnew/

Blog | https://everenew.tistory.com/





티스토리 뷰

반응형

문제

 

https://school.programmers.co.kr/learn/courses/30/lessons/340212

 

프로그래머스

코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.

programmers.co.kr

 

 

풀이

 

난이도: Lv.2

 

 

일단 정답은 문제들 중 최대 diff(난이도) 만큼의 level(숙련도)의 이하일 것이다.

level 최대 diff보다 높아도 이미 모든 문제를 한 번의 시도로 풀 수 있기 때문에 의미가 없다.

 

따라서 1 ~ max_diff 사이에 정답이 있다.

가장 간단히는 max_diff부터 순서대로 숙련도를 1씩 줄이면서 시간 안에 문제를 풀어보는 브루트 포스 방법을 생각할 수 있다.

하지만 diff는 최대 100,000이고 퍼즐이 최대 300,000 개이므로,

최악의 경우 대략 30,000,000,000 (300억)번의 연산이 발생하므로 시간 초과가 발생한다.

(Python보다 빠른 C++이라도 10억번 이상의 연산은 시간 초과 발생.)

 

 

 

이처럼 시간 복잡도가 극단적인 경우 다른 방법을 생각해야 한다.

특정 구간(여기서는 1~ max_diff)에서 정답을 맞추는 경우는 업다운 게임처럼 가운데 숫자를 확인해서 구간을 반씩 좁혀나가는 이진 탐색이 효과적이다.

이진 탐색은 O(nlogn)의 시간복잡도 이므로 충분히 시간안에 해결가능하다.

 

 

왼쪽 끝인 l와 오른 쪽 끝인 r을 설정하고 중간 값으로 시간 안에 풀리는지 확인하도록 구현하자.

 

 

코드

 

 

반응형
댓글
반응형
인기글
Total
Today
Yesterday
«   2024/12   »
1 2 3 4 5 6 7
8 9 10 11 12 13 14
15 16 17 18 19 20 21
22 23 24 25 26 27 28
29 30 31
글 보관함