-
[프로그래머스 1단계] 알고리즘 11. 나누어 떨어지는 숫자 배열24년 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을 배열로 바꿔서 반환하면 된다.
항상 알고리즘을 새로운 방식으로 풀었을 때 그 쾌감은 참 좋으디 좋으디 ㅋㅋㅋ 조금 더 높은 난이도의 문제를 이처럼 함수형으로 풀어보고 싶다!
728x90'레거시 > 레거시-알고리즘(3)' 카테고리의 다른 글
[프로그래머스 1단계] 알고리즘 13. x만큼 간격이 있는 n개의 숫자 (0) 2018.03.23 [프로그래머스 1단계] 알고리즘 12. 문자열 내림차순으로 배치하기 (0) 2018.03.22 [프로그래머스 1단계] 알고리즘 10. 정수 제곱근 판별하기 (0) 2018.03.19 [프로그래머스 1단계] 알고리즘 9. 자릿수 더하기 (0) 2018.03.15 [프로그래머스 1단계] 알고리즘 8. 문자열 다루기 기본 (0) 2018.03.12