[프로그래머스] 점프와 순간 이동 ( 자바 )
OO 연구소는 한 번에 K 칸을 앞으로 점프하거나, (현재까지 온 거리) x 2에 해당하는 위치로 순간이동을 할 수 있는 특수한 기능을 가진 아이언 슈트를 개발하여 판매하고 있습니다. 이 아이언 슈트는 건전지로 작동되는데, 순간이동을 하면 건전지 사용량이 줄지 않지만, 앞으로 K 칸을 점프하면 K 만큼의 건전지 사용량이 듭니다. 그러므로 아이언 슈트를 착용하고 이동할 때는 순간 이동을 하는 것이 더 효율적입니다. 아이언 슈트 구매자는 아이언 슈트를 착용하고 거리가 N 만큼 떨어져 있는 장소로 가려고 합니다. 단, 건전지 사용량을 줄이기 위해 점프로 이동하는 것은 최소로 하려고 합니다. 아이언 슈트 구매자가 이동하려는 거리 N이 주어졌을 때, 사용해야 하는 건전지 사용량의 최솟값을 return 하는 solution 함수를 만들어 주세요.
제한 사항
- 숫자 N: 1 이상 10억 이하의 자연수
- 숫자 K: 1 이상의 자연수
출처: 프로그래머스 코딩 테스트 연습, https://programmers.co.kr/learn/courses/30/lessons/12980
핵심
-
오류
처음에 완탐으로 해결할 수 있다고 생각했다가 시간 초과 났다. 그리고 나름 dp로 했음에도 효율성에서 시간초과가 났다. (dp [i]: i위치까지 오는데 최소 건전지 사용량) 시간도 O(N)이었는데 시간 초과가 난 것을 보면 처음부터 틀렸다는 것을 알았다.
-
O(logN)
2배씩 이동하므로 N계산 값과 N/2 계산 값이 동일하다.
그래서 거꾸로 시작했다. N이 짝수? N/2로 이동, N이 홀수? (N-1)/2 로 이동하고 연비 1 사용 -
N이 홀수일 때, 왜 -3,-5도 아닌 왜 -1?
N-1, N-3은 1,3 만큼 차이나며 둘 다 짝수. 둘다 2로 나누면 1밖에 차이 안 난다. N에서 N-3으로 3만큼 이동하지 않아도 N-1에서 순간 이동 후(홀수라면) 1만 소비하면 N-3/2로 이동 가능하여 연비를 아낄 수 있다.
추가적으로 더 궁금한 점 있으면 댓글 달아주세요
코드
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
|
public class Solution {
public int solution(int N) {
int ans = 1;
while(N != 1) {
if(N%2 == 0) {
N /= 2;
}else {
N = (N-1)/2;
ans++;
}
}
return ans;
}
}
|
cs |
'CS > 알고리즘 풀이' 카테고리의 다른 글
[ 프로그래머스 2017 카카오코드 본선] 단체사진 찍기 (java) (5) | 2019.12.25 |
---|---|
[ 백준 17779 ] 게리맨더링 2 (java) (0) | 2019.12.23 |
[프로그래머스] 다리를 지나는 트럭 ( java ) (0) | 2019.12.21 |
[프로그래머스- 2018 카카오 공채] 다트 게임 (java) (0) | 2019.12.15 |
[ 프로그래머스- 2020 카카오 공채] 괄호 변환 (java) (0) | 2019.12.15 |