Codewars 문제풀기 (04/24)
Find the unique number
- double 배열을 인자로 받는다.
- 배열의 크기는 3이상이며 배열 element는 반드시 다른 값을 가진 element가 한개 있다.
- 다른 element 값을 리턴한다.
- findUniq({1,2,1}) 👉 2
- findUniq({55,1,1,1,1,1}) 👉 55
- findUniq({0,0,0,0,0.4}) 👉 0.4
1. Test와 리팩토링
-
테스트 1 - 입력 배열이 {1,2,2} 라면 1을 리턴한다.
-
테스트 코드
@Test @DisplayName("test should return 1 when array is {1, 2, 2}") public void test1() { // Given: Set array first element not same double[] given = new double[]{2, 1, 2}; // When: Call findUniq method double actual = Kata.findUniq(given); // Then: Should return 1 assertEquals(1, actual); }
-
실제 코드
public class Kata { public static double findUniq(double[] arr) { return 1; } }
-
리팩토링 - arr[0]을 리턴한다.
public class Kata { public static double findUniq(double[] arr) { return arr[0]; } }
-
-
테스트 2 - 입력 배열이 {0, 0, 0, 0, 0, 0.55} 라면 0.55를 리턴한다.
-
테스트 코드
@Test @DisplayName("test should return 0.55 when array is {0, 0, 0, 0, 0, 0.55}") public void test2() { // Given: Set array last element not same double[] given = new double[]{0, 0, 0, 0, 0, 0.55}; // When: Call findUniq method double actual = Kata.findUniq(given); // Then: Should return 0.55 assertEquals(0.55, actual); }
-
실제 코드
public class Kata { public static double findUniq(double[] arr) { return arr[0]==arr[1] ? arr[arr.length-1] : arr[0]; } }
- 일단은 첫번째 element아니면 last element가 다른 값으로 가정했기 때문에 [0]==[1]이면 last element를 [0]!=[1]이라면 first element를 리턴하도록 했다.
-
-
테스트 3 - 입력 배열이 {2, 1, 2, 2, 2, 2} 라면 1을 리턴한다.
-
테스트 코드
@Test @DisplayName("test should return 1 when array is {2, 1, 2, 2, 2, 2}") public void test3() { // Given: Set array middle element not same double[] given = new double[]{2, 1, 2, 2, 2, 2}; // When: Call findUniq method double actual = Kata.findUniq(given); // Then: Should return 1 assertEquals(1, actual); }
-
실제 코드
public class Kata { public static double findUniq(double[] arr) { if (arr[0] != arr[1] && arr[0] != arr[2]) { return arr[0]; } for (int i = 1; i < arr.length; i++) { if (arr[0] != arr[i]) { return arr[i]; } } return 0; } }
- [0]!=[1]이면 둘 중 하나를 리턴해야하는데, [0]!=[2]이면 0만 다르다는 얘기이므로 arr[0]을 리턴한다. 그 외에는 arr[0]이 답이 되는 경우가 없기 때문에 for문을 돌며 arr[0]과 다른 값을 찾아서 리턴한다.
- 리팩토링하려고 for문을 쓰지 않고 답을 구하는 방법을 생각해봤다. 근데 떠오르지 않아서 그냥 제출했다.
-
-
약 20분 소요
2. 답 비교, 느낀점
Best Practice 가장 많이 받은 코드
import java.util.Arrays;
public class Kata {
public static double findUniq(double[] arr) {
Arrays.sort(arr);
return arr[0] == arr[1] ? arr[arr.length-1]:arr[0];
}
}
- 배열을 정렬하면 값이 first element 혹은 last element 하나이다. 이 방법을 왜 생각 못했을까…. 겁나 쉽게풀었네..
댓글남기기