프로그래머스 레벨 2 점프와 순간이동 문제를 풀이했다.
처음에 구현할 때 문제 설명에따라서 로직을 구현하려다보니 되게 복잡한 로직이 완성되었었고 몇 개의 테스트케이스에서 실패 판정을 받아서 통과하지 못했었다..
방법을 고민하다가 질문하기란에 들어가 한가지 힌트를 얻고 그대로 풀이했다.
풀이하고 보니 허탈할 정도로 너무 단순하게 풀이가 가능했다..
n을 줄여가며(점프는 1 이동 및 배터리소모 1, 순간이동은 2배 이동 및 배터리소모 0이므로)
단순하게 n을 2로 나눈 나머지가 0 이라면 순간이동을 할 수 있으니 순간이동, 0이 아니라면 점프를 해야하니 배터리를 1 소모하는 방식으로 풀이를 완성했다.
어려워보일수록 로직은 더 간단하고 쉬워보일수록 로직은 더 복잡한 코딩 테스트의 세계...ㅜ
JumpAndTeleport.java
package com.example.Programmers.Lv2;
/**
* 프로그래머스 Lv2 - 점프와 순간이동
*/
public class JumpAndTeleport {
public int solution(int n) {
int ans = 0;
while (n > 0) {
// 2로 나눈 나머지가 0 -> 순간이동 했으니 배터리 소모가 없다
if (n % 2 == 0) {
n /= 2;
// 2로 나눈 나머지가 0이 아님 -> 점프를 해야하니 배터리 1 소모
} else {
n--;
ans++;
}
}
return ans;
}
}
JumpAndTeleportTest.java
package com.example.Programmers.Lv2;
import static org.junit.Assert.assertEquals;
import org.junit.Test;
public class JumpAndTeleportTest {
@Test
public void testJumpAndTeleport() {
JumpAndTeleport j = new JumpAndTeleport();
int result1 = j.solution(5);
int result2 = j.solution(6);
int result3 = j.solution(5000);
assertEquals(2, result1);
assertEquals(2, result2);
assertEquals(5, result3);
}
}