Codewars 문제풀기 (04/20)
Build a pile of Cubes
- long을 인자로 받는다.
- 1³ + 2³ + 3³ … + (n-1)³ + n³ = 인자로 받은 수가 되는 자연수 n을 리턴한다.
- n이 없다면 -1을 리턴한다.
1. Test와 리팩토링
-
테스트 1 - 인자가 1이라면 1을 리턴한다.
-
테스트 코드
@Test public void testShouldReturn1WhenInput1() { // Given: Set long 1 long given = 1; // When: Call findNb method long actual = ASum.findNb(given); // Then: Should return 1 assertEquals(1, actual); }
-
실제 코드
public class ASum { public static long findNb(long m) { return 1; } }
-
-
테스트 2 - 인자가 9라면 2를 리턴한다. (1³ + 2³ = 9)
-
테스트 코드
@Test public void testShouldReturn2WhenInput9() { // Given: Set long 9 long given = 9; // When: Call findNb method long actual = ASum.findNb(given); // Then: Should return 2 assertEquals(2, actual); }
-
실제 코드
public class ASum { public static long findNb(long m) { long sum = 0; for (long i = 0; sum <= m; i++) { sum += (i * i * i); if (sum == m) { return i; } } return 0; } }
- sum을 선언하여 for문에서 1^3부터 계속 더해준다. sum이 인자와 같아지면 i를 리턴한다.
-
-
테스트 3 - 인자가 8이라면 -1을 리턴해야한다.
-
테스트 코드
@Test public void testShouldReturnNegative1WhenInput8() { // Given: Set long 8 long given = 8; // When: Call findNb method long actual = ASum.findNb(given); // Then: Should return -1 assertEquals(-1, actual); }
-
실제 코드
public class ASum { public static long findNb(long m) { long sum = 0; for (long i = 0; sum <= m; i++) { sum += (i * i * i); if (sum == m) { return i; } } return -1; } }
- 반복문을 나가면 0대신 -1을 리턴하도록 변경
-
리팩토링 - for문 대신 while문 사용
public class ASum { public static long findNb(long m) { long sum = 0; long result = 0; while (sum < m) { result++; sum += (result * result * result); } return sum == m ? result : -1; } }
-
-
고등학교 때 배운 1~n까지 합(∑k), 1² ~ n²까지 합(∑k²) 등이 생각 났는데 식 자체는 몰라서 그냥 제출했다.(약 10분)
2. 답 비교, 느낀점
Best Practice 가장 많이 받은 코드
public class ASum {
public static long findNb(long m) {
long mm = 0, n = 0;
while (mm < m) mm += ++n * n * n;
return mm == m ? n : -1;
}
}
- 나는
result++; sum += ....
으로 풀었는데 그냥sum += ++result * ...
으로 했으면 한줄로 해결할 수 있다.
댓글남기기