ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [프로그래머스 1단계] 알고리즘 11. 나누어 떨어지는 숫자 배열
    레거시/레거시-알고리즘(3) 2018. 3. 21. 16:04
    반응형

    문제 출처는 프로그래머스 알고리즘 연습 에서 볼 수 있습니다!(https://programmers.co.kr/learn/challenges)


    알고리즘 11. 나누어 떨어지는 숫자 배열:


    divisible 메소드는 int형 배열 array와 int divisor를 매개변수로 받습니다.array의 각 element 중 divisor로 나누어 떨어지는 값만 포함하는 새로운 배열을 만들어서 반환하도록 divisible에 코드를 작성해 보세요.예를들어 array가 {5, 9, 7, 10}이고 divisor가 5이면 {5, 10}을 리턴해야 합니다.


    import java.util.Arrays;

    class Divisible {
        public int[] divisible(int[] array, int divisor) {
            //ret에 array에 포함된 정수중, divisor로 나누어 떨어지는 숫자를 순서대로 넣으세요.
            int[] ret = new int[나누어 떨어지는 숫자의 개수];
            return ret;
        }
        // 아래는 테스트로 출력해 보기 위한 코드입니다.
        public static void main(String[] args) {
            Divisible div = new Divisible();
            int[] array = {5, 9, 7, 10};
            System.out.println( Arrays.toString( div.divisible(array, 5) ));
        }
    }


    풀이:

    오랜만에 자바를 보니 반갑다. 나는 알고리즘 혹은 서버를 작성해야 할 때는 일반 명령형 프로그래밍보다 함수형 프로그래밍이 더 좋다고 생각하는 편이다. 왜냐하면 코드가 간편한 것도 있지만 어떤 문제가 닥칠 수 있는 예외 상황들(레이스 컨디션 등의)을 배제하고 코드를 짤 수 있기 때문이다. 일단 이 문제는 주어진 배열에서 divisor로 나누어 떨어지는 수들을 다시 새로운 배열로 모으는 것이 핵심이다. 먼저 나의 코드는 다음과 같다.


    public int[] divisible(int[] array, int divisor) {
            //ret에 array에 포함된 정수중, divisor로 나누어 떨어지는 숫자를 순서대로 넣으세요.
            return IntStream.of(array)
                            .filter( i -> (i % divisor) == 0)
                            .toArray();
    }


    먼저 이 문제를 풀기 위해 자바8의 Stream API를 이용할 생각이다. 자바에서 일반 스트림은 객체 타입만 지원한다. 즉 int, byte, char 등은 일반 스트림에 사용할 수 없다. 때문에 이들 기본형에 대한 Stream API를 따로 만들어두었는데 그 중 하나가 IntStream이다. 먼저 코드를 보면서 살펴보자.


    IntStream.of(array)


    먼저 IntStream.of(배열)은 주어진 배열로 IntStream을 만들어낸다. 그 후 일반 스트림과 사용법은 같다. 


    .filter( i -> (i % divisor) == 0)


    IntStream.filter()를 이용하여 스트림 요소들 중 divisor로 나누어 떨어지는 요소들을 필터링시킨다.


    .toArray();


    그 후 IntStream.toArray() 메소드를 이용하여 필터링 된 IntStream을 배열로 바꿔서 반환하면 된다. 


    항상 알고리즘을 새로운 방식으로 풀었을 때 그 쾌감은 참 좋으디 좋으디 ㅋㅋㅋ 조금 더 높은 난이도의 문제를 이처럼 함수형으로 풀어보고 싶다!

Designed by Tistory.