[Java] 12980 점프와 순간 이동
📝 점프와 순간 이동
1. 문제 요약
- K칸 점프 → K만큼 건전지 소비
- 현재까지의 거리 * 2로 순간이동 → 건전지 소비 X
- 거리 n까지 이동하는데 드는 최소 건전지의 개수 리턴
- 아래 예시에서 방법 3이 가장 적은 건전지 소비
2. 정답코드
class Solution {
public int solution(int n) {
int battery = 0;
while (n > 0) {
if ((n & 1) == 0) { // 짝수면 순간이동 역추적
n >>= 1;
} else { // 홀수면 점프 1칸 역추적
n -= 1;
battery++;
}
}
return battery;
}
}
거꾸로 생각하면 된다. N을 0으로 줄여간다고 생각하자.
- N이 짝수일 때
→ 직전에 무조건 순간이동으로 왔음
→ 따라서 N /= 2 (배터리 소모 없음) - N이 홀수일 때
→ 직전에 반드시 앞으로 1칸 점프를 했어야 함
→ 따라서 N -= 1 (배터리 +1)
이 과정을 N이 0이 될 때까지 반복하면 홀수였던 횟수 = 점프 횟수 = 배터리 소모량이 된다.
즉, 이 코드는 N을 이진수로 쭉 읽으면서 1이 나올 때마다 점프 횟수(battery)를 세는 것이다.
이걸 한 줄로 줄이는 방법이 있다.
class Solution {
public int solution(int n) {
return Integer.bitCount(n); // n의 이진수에서 1의 개수
}
}
이진수로 N
을 표현했을 때,
- 1 → 홀수 → 점프 필요 (배터리 +1)
- 0 → 짝수 → 순간이동 (배터리 +0)
- 따라서 N의 이진수에서 1의 개수 = 최소 배터리 소모량이 된다.
예시) N = 5
- 이진수 =
101
- 1이 2개 있음 → 배터리 2 소모
- 실제 과정: 5(홀수 → -1, 배터리1) → 4(짝수 → /2) → 2(짝수 → /2) → 1(홀수 → -1, 배터리1) → 0
- 최종 배터리 = 2
3. 오답 / 어려웠던 점
솔직히 어떻게 해야 할 지 1도 감이 안 와서 남의 코드 보고 풀었따다 ㅋ
다음부터는 내가 혼자서 풀면 되니까 ㅋㅋ
그리고 홀수 판별식 n % 2 == 1
를 이렇게도 쓸 수 있다. (n & 1) == 1