Codewars 문제풀기 (04/12)
Sum of odd numbers
-
int를 인수로 받는다.
-
1 3 5 7 9 11 13 15 17 19 21 23 25 27 29
-
위와 같은 형태로 홀수가 나열되어있다고 가정하자
-
rowSumOddNumbers(1) –> 1 –> 1
-
rowSumOddNumbers(2) –> 3 + 5 –> 8
- rowSumOddNumbers(3) –> 13 + 15 + 17 + 19 –> 27
1. Test와 리팩토링
-
입력 인자가 1일경우 1을 리턴한다.
-
테스트 코드
@Test public void testShouldReturn1WhenInputIs1() { // Given: Set input is 1 int given = 1; // When: Call rowSumOddNumbers method int actual = RowSumOddNumbers.rowSumOddNumbers(given); // Then: Should return 1 assertEquals(1, actual); }
-
실제 코드
public class RowSumOddNumbers { public static int rowSumOddNumbers(int n) { return 1; } }
-
-
입력 인자가 2일경우 8을 리턴한다.
-
테스트 코드
@Test public void testShouldReturn8WhenInputIs2() { // Given: Set input is 2 int given = 2; // When: Call rowSumOddNumbers method int actual = RowSumOddNumbers.rowSumOddNumbers(given); // Then: Should return 8 assertEquals(8, actual); }
-
실제 코드
public class RowSumOddNumbers { public static int rowSumOddNumbers(int n) { int startIndex = 0; int endIndex = 0; for (int i = 0; i <= n; i++) { endIndex += i; } startIndex = endIndex - n; int[] oddArray = new int[endIndex]; int odd = 1; for (int i = 0; i < endIndex; i++) { oddArray[i] = odd; odd += 2; } int sum = 0; for (int i = startIndex; i < endIndex; i++) { sum += oddArray[i]; } return sum; } }
- 입력 인자 n까지의 합으로 배열을 만들어 각 배열에 1, 3, 5 …홀수들을 저장했다. 그리고 홀수 탑을 봤을 때 배열에 저장된 index가 n-1까지의 합 ~ n까지의 합이므로 startIndex와 endIndex에 각 저장 후 그 사이의 홀수들의 합을 리턴했다.
-
-
리팩토링을 하려했는데 작성한 테스트 코드들을 보니 1가 인자일 때 1³이고 2일 때 2³ 이다. 홀수 탑을 다시보니 3일때 3³이고 4일때 4³이다.
-
리팩토링
-
그냥 n의 3제곱으로 해결할 수 있다.
public class RowSumOddNumbers { public static int rowSumOddNumbers(int n) { return n * n * n; } }
-
2. 답 비교, 느낀점
Best Practice 가장 많이 받은 코드
class RowSumOddNumbers {
public static int rowSumOddNumbers(int n) {
return n * n * n;
}
}
- 테스트 코드를 보고 문제 답의 패턴도 대충 파악할 수 있다는것을 느꼈다.
댓글남기기