Codewars 문제풀기 (05/04)
Sort the odd
-
int[] array를 인자로 받는다.
-
array의 짝수는 그 위치 그대로 두고 홀수만 정렬해서 리턴한다.
-
array가 empty array거나 null이라면 array empty를 리턴한다.
sortArray({5, 3, 2, 8, 1, 4}) 👉 {1, 3, 2, 8, 5, 4} sortArray({5, 3, 1, 8, 0}) 👉 {1, 3, 5, 8, 0}
1. Test와 리팩토링
-
테스트 1 - 입력 배열이 빈 배열일 때 빈 배열을 리턴한다.
-
테스트 코드
@Test @DisplayName("test should return empty array when input is empty array") public void test1() { // Given: Set empty array int[] given = new int[]{}; // Then: Should return empty array assertArrayEquals(given, Kata.sortArray(given)); }
-
실제 코드
public class Kata { public static int[] sortArray(int[] array) { if (array == null || array.length == 0) { return new int[]{}; } return array; } }
- null인 경우도 같이 구현했다.
-
-
테스트 2 - 입력 배열이 홀수로만 구성되어 있을 경우 전체 sort해서 리턴한다.
-
테스트 코드
@Test @DisplayName("test should return ascending sorted array when input has only odd elements") public void test2() { // Given: Set array has only odd number int[] given = new int[]{7, 3, 5, 1, 9, 17, 13, 29, 45}; // Then: Should return ascending sorted array assertArrayEquals(new int[]{1, 3, 5, 7, 9, 13, 17, 29, 45}, Kata.sortArray(given)); }
-
실제 코드
public class Kata { public static int[] sortArray(int[] array) { if (array == null || array.length == 0) { return new int[]{}; } Arrays.sort(array); return array } }
- 단순히 array를 sort해서 리턴했다.
-
-
테스트 3 - 짝수는 위치 그대로 두고 홀수만 정렬한다.
-
테스트 코드
@Test @DisplayName("test should return even number be their places") public void test3() { // Given: Set array has odd and even number int[] given = new int[]{5, 3, 2, 8, 1, 4}; // Then: Should return ascending sorted array assertArrayEquals(new int[]{1, 3, 2, 8, 5, 4}, Kata.sortArray(given)); }
-
실제 코드
public class Kata { public static int[] sortArray(int[] array) { if (array == null || array.length == 0) { return new int[]{}; } List<Integer> oddSortedList = new ArrayList<>(); for (int i = 0; i < array.length; i++) { if (array[i] % 2 == 1) { oddSortedList.add(array[i]); } } oddSortedList = oddSortedList.stream().sorted().collect(Collectors.toList()); int oddSortedListIndex = 0; for (int i = 0; i < array.length; i++) { if (array[i] % 2 == 1) { array[i] = oddSortedList.get(oddSortedListIndex); oddSortedListIndex++; } } return array; } }
- List에 array의 홀수만 저장한 뒤 정렬했다. 그리고 array에서 element가 홀수라면 List에 저장된 값을 순서대로 저장하고 짝수라면 그냥 넘어간다.
-
2. 답 비교, 느낀점
Best Practice 가장 많이 받은 코드
public class KataBestPractice {
public static int[] sortArray(int[] array) {
int[] oddSortedArray = IntStream.of(array).filter(x -> x % 2 == 1).toArray();
for (int i = 0, oddSortedArrayIndex = 0; i < array.length; i++) {
if (array[i] % 2 == 1) {
array[i] = oddSortedArray[oddSortedArrayIndex++];
}
}
return array;
}
}
- 방법은 같은데 훨씬 더 짧게 구현했다.
- 굳이 List에 저장하지 않고, 배열에 저장해도 되는데 나는 왜 List에 저장했을까.. 생각해보면 리팩토링할때 좀 더 깊이 고민하지 않는다. 문제 통과하는데에 만족을 해버려서 그런것 같다. 이 부분이 굳이 필요한가? 한번 더 생각해보고 리팩토링하고 제출하도록 해야할것같다 ㅜ
댓글남기기