Codewars 문제풀기 (03/16)

Sum of numbers

  • 정수 두개를 인자로 받는다(a,b).
  • a부터 b까지의 정수들 합을 구한다.
  • a==b라면 a나 b를 리턴한다.

1. Test를 만들었다

  • 입력 인자가 둘 다 같을 경우

    • 테스트 코드
      @Test
      public void testWhenStartNumberIsSameWithEndNumber() {
        //Given
        int givenStart = 2;
        int givenEnd = 2;
        //When
        int actual = Sum.getSum(givenStart, givenEnd);
        //Then
        assertEquals(2, actual);
      }
    
    • 실제 코드
    public class Sum {
      
      public static int getSum(int a, int b) {
          return a==b ? a : 0;
      }
    }
    
  • 입력 인자 중 첫번째 인자(a)가 두번째 인자(b)보다 작은 경우

    • 테스트 코드
      @Test
      public void testWhenStartNumberIsSmallerThanEndNumber() {
        //Given
        int givenStart = 1;
        int givenEnd = 10;
        //When
        int actual = Sum.getSum(givenStart, givenEnd);
        //Then
        assertEquals(55, actual);
      }
    
    • 실제 코드
    public class Sum {
      
      public static int getSum(int a, int b) {
        if (a == b) {
          return a;
        }
        int start = 0;
        int end = 0;
        int sum = 0;
        if (a < b) {
          start = a;
          end = b;
        } 
        for (int i = start; i <= end; i++) {
          sum += i;
        }
      
        return sum;
      }
    }
    
  • 입력 인자 중 첫번째 인자(a)가 두번째 인자(b)보다 큰 경우

    • 테스트 코드
      @Test
      public void testWhenStartNumberIsBiggerThanEndNumber() {
        //Given
        int givenStart = 10;
        int givenEnd = 1;
        //When
        int actual = Sum.getSum(givenStart, givenEnd);
        //Then
        assertEquals(55, actual);
      }
    
    • 실제 코드
    public class Sum {
      
      public static int getSum(int a, int b) {
        if (a == b) {
          return a;
        }
        int start = 0;
        int end = 0;
        int sum = 0;
        if (a < b) {
          start = a;
          end = b;
        } else {
          start = b;
          end = a;
        }
      
        for (int i = start; i <= end; i++) {
          sum += i;
        }
      
        return sum;
      }
    }
    

    Success (약 7분)

2. 리팩토링 시작

  • 대소 비교를 할 때, if(a>b) else를 쓰는거 보다 그냥 max, min 메소드를 써도 되겠다고 생각해서 수정

    public class Sum {
      
      public static int getSum(int a, int b) {
          int sum = 0;
          for(int i = Math.min(a,b); i <= Math.max(a,b); i++) {
              sum += i;
          }
          return sum;
      }
    }
    

    이러면 a==b라도 a한번만 더하므로 분기 처리할 필요없어서 따로 추가안함

    제출

3. 답 비교, 느낀점

Best Practice 가장 많이 받은 코드

public class Sum
{
  public int GetSum(int a, int b)
  {
    return (a + b) * (Math.abs(a - b) + 1) / 2;
  }
}
  • 생각해보니 등차수열의 합이다. 첫째 항과 마지막 항, 수열 개수를 알 때 등차수열의 합은
    • (개수 * (첫째 항 + 마지막 항)) / 2

두번째로 많이 받은 코드

  public class Sum
  {
    public int GetSum(int a, int b) {
      int res = 0;
      for (int i = Math.min(a, b); i <= Math.max(a, b); i++) {
        res += i;
      }
      return a == b ? a : res;
    }
  }
  • 내가 작성한 코드와 비슷한데 마지막에 분기처리를 해주었다.

4. 궁금한거 공부

  • 없음

댓글남기기