티스토리 뷰

금주 스터디에서 처음으로 Codewars의 Kata문제를 풀어보았습니다. Sorting the odd way! 라는 문제를 풀었는데요. 알고리즘이나 이런 문제풀이를 할 때 가장 흥미로운 건 역시 남이 만든 코드 리뷰하는게 아닐까 싶어요. 결론적으로 이 문제를 푼 다른 개발자님 중 JAVA8을 사용하여 단 두줄로 문제를 푼 것을 보고 충격을 받았습니다. 스트림과 람다식을 이용하여 푸셨는데요. JAVA8을 잘 사용하면 정말 막강한 코드(프로그램)이 되겠구나 하는 생각을 하게 되었습니다.


다음 이미지가 카타의 모습이에요. 문제의 등급이 8~1까지 있구요, 언어도 다양하게 선택할 수 있습니다^^

https://www.codewars.com/ >카타 바로가기!



이번주에 풀었던 문제는 다음과 같았습니다.

 Description:

Given an array of numbers, sort them in such a manner that all the odd numbers in the array are sorted in ascending order and the even numbers are sorted in descending order after the last odd number. For example [1,2,3,4,5,6,7,8,9] produces the output [1,3,5,7,9,8,6,4,2]. If the array contains decimals, round them down while checking for odd/even. The output must have the original numbers!

P.S- Please don't ask for random tests. I'm too stupid to write them!

If there are no issues with the kata and you successfully completed it, please rank and upvote!

해석을 해보면 대략 다음과 같습니다.

설명:

주어진 배열을 정렬하되, 홀수는 오름차순으로 정렬하고, 마지막 홀수 뒤에 짝수를 내림차순으로 정렬하라. 단, 원소가 소수일 때에는 홀수와 짝수를 체크할 때에만 반내림하여라. 즉, 출력은 입력된 원소의 형태 그대로 출력되어야 한다.  



스터디 조원 중 한 분과 짝프로그래밍을 해서 푼 결과입니다. Compartor를 사용한 것이 특징이 될 수 있겠네요.

code1

import java.util.*;

/**
* Created by dasom on 2016-10-29.
*/
public class Kata {

public static Double[] sortItOut(Double[] array) {
//your code

// 홀/짝 판단
ArrayList<Double> odds = new ArrayList<>();
ArrayList<Double> evens = new ArrayList<>();

for(double d : array){
double temp = Math.floor(d);

if(temp % 2.0 == 0){
//짝수이다
evens.add(d);
}else{
//홀수이다
odds.add(d);
}
}

// 홀수는 오름차순, 짝수는 내림차순으로 정렬
odds.sort(new AscComparator());
evens.sort(new DescComparator());

// 두 배열을 합친다.
Double[] newArr = new Double[odds.size() + evens.size()];

int index = 0;
for(double d : odds){
newArr[index++] = d;
}

for(double d : evens){
newArr[index++] = d;
}

return newArr;
}

static class AscComparator implements Comparator<Double> {
@Override
public int compare(Double o1, Double o2) {
return o1 < o2 ? -1 : 1;
}
}

static class DescComparator implements Comparator<Double> {
@Override
public int compare(Double o1, Double o2) {
return o1 > o2 ? -1 : 1;
}
}
}


다음은 PeaceTran님이 작성하신 조금 더 간결한 코드입니다. code1과 차이가 있다면 Collections를 잘 이용하여 간결하게 작성했다는 점 같아요.ㅎㅎ

code2

import java.util.ArrayList;
import java.util.Collections;
import java.util.List;

public class Kata {
public static Double[] sortItOut(Double[] array) {
List<Double> even = new ArrayList();
List<Double> odd = new ArrayList();
for (int i = 0; i < array.length; i++) {
if (Math.floor(array[i]) % 2 == 0) {
even.add(array[i]);
} else {
odd.add(array[i]);
}
}
Collections.sort(odd);
Collections.sort(even);
Collections.reverse(even);
odd.addAll(even);
return odd.toArray(array);
}
}


다음은 TomSmurf님이 JAVA8을 이용하여 작성한 코드입니다! 단 세줄로 홀/짝 판단, 정렬, 배열 Merge까지 한 것이죠ㅎㅎ code1, code2와 확실하게 비교되는 코드입니다.

code3

import java.util.Arrays;
import java.util.Comparator;
import java.util.stream.Stream;

public class Kata {
public static Double[] sortItOut(Double[] array) {
Stream<Double> even = Arrays.stream(array).filter(x -> x.intValue() % 2 == 0).sorted(Comparator.reverseOrder());
Stream<Double> uneven = Arrays.stream(array).filter(x -> x.intValue() % 2 != 0).sorted();
return Stream.concat(uneven, even).toArray(Double[]::new);
}
}



요번에 스터디에서 JAVA8에 대해 공부하기로 했는데요. 처음에는 JAVA8에 흥미가 없었는데 이런 간결하고 흥미로운 코드를 보니 JAVA8 꼭 배워야겠다는 생각이 마구마구 들었습니다ㅎㅎ

열심히해봐요~



댓글
댓글쓰기 폼
공지사항
Total
37,833
Today
31
Yesterday
37
링크
TAG
more
«   2018/05   »
    1 2 3 4 5
6 7 8 9 10 11 12
13 14 15 16 17 18 19
20 21 22 23 24 25 26
27 28 29 30 31    
글 보관함