본문 바로가기

Algorithm/Programers - Java

[프로그래머스] 나누어 떨어지는 숫자 배열/ stream

 

Level. 1

 

문제

 

풀이

import java.util.*;
class Solution {
    public int[] solution(int[] arr, int divisor) {
        ArrayList<Integer> list = new ArrayList<Integer>();
        for(int i=0; i<arr.length; i++){
            if(arr[i]%divisor == 0){
                list.add(arr[i]);
            }
        }
        
        if(list.isEmpty()) {
            list.add(-1);
        }
        
        int[] answer = list.stream().mapToInt(i -> i).toArray();
        Arrays.sort(answer);
        return answer;
    }
}

list를 사용하여 정답을 구한 후, return타입에 맞추어 array로 변경해 주었다.

 

ListArray -> Array

list.stream().mapToInt(i -> i).toArray();

 

 

 


다른 사람 풀이 

import java.util.Arrays;

class Solution {
  public int[] solution(int[] arr, int divisor) {
          int[] answer = Arrays.stream(arr).filter(factor -> factor % divisor == 0).toArray();
          if(answer.length == 0) answer = new int[] {-1};
          java.util.Arrays.sort(answer);
          return answer;
  }
}

위 코드는 스트림(stream)을 사용하여 매우 간결하게 문제를 해결하였다.

stream..? 아주 유용해 보이니 사용법과 주로 언제 사용하게 되는지 알아보겠다.

 

stream - 스트림

스트림을 사용하면 배열이나 컬렉션(List, Set, Map)으로 원하는 값을 얻을 때 for문 도배를 방지할 수 있다. 

스트림은 선언 - 가공 - 반환 세 부분으로 이뤄진다.

 

1. 스트림 - 선언

Stream<데이터타입> stream명 = Arrays.stream(배열명);
Stream<데이터타입> stream명 = 리스트명.stream();
Stream<데이터타입> stream명 = Stream.of('값', '값'....);

Arrays.stream(배열명).가공메소드...
리스트명.stream.가공메소드...

 

2. 스트림 - 가공

  • 스트림을 필요한 형태로 가공한다. 
  • .filter(파라미터) -> {코드}) : 코드에 맞는 값만 가져온다

3. 스트림 - 반환

  • 가공한 값을 원하는 배열, 컬렉션(List, Set, Map) 등의 원하는 형태로 반환한다.
    • .toArray() : 배열로 반환
    • .collect(Collectors.toList()) : List 로 반환 
    • .collect(Collectors.toSet()) : Set 으로 반환 
    • .collect(Collectors.toMap()) : Map 으로 반환 

 

Arrays.stream()

 

Arrays.stream(array, int a1, int a2) // a1부터 (a2-1)까지의 요소를 가져온다.

 

  • .filter() : 가져온 요소에 조건을 건다. 
                    Arrays.stream(array).filter(요소 -> 조건)

  • .toArray() : 가공한 값을 배열로 반환한다. 

 

stream 장단점 

장점 - 사용하기 편하다.
- 코드가 단축된다
- 가독성이 높아진다
단점 - 디버그가 힘들다
- 재활용이 불가능하다. 

 

 


https://school.programmers.co.kr/learn/courses/30/lessons/12910?language=java 

 

프로그래머스

코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.

programmers.co.kr

https://ju-nam2.tistory.com/8

 

[Java][프로그래머스][Level 1] 나누어 떨어지는 숫자 배열

문제 설명 array의 각 element 중 divisor로 나누어 떨어지는 값을 오름차순으로 정렬한 배열을 반환하는 함수, solution을 작성해주세요.divisor로 나누어 떨어지는 element가 하나도 없다면 배열에 -1을 담

ju-nam2.tistory.com

https://wakestand.tistory.com/419

 

자바 스트림(Stream) 예제부터 사용법까지 정리

자바에서 스트림이라고 하면 대부분 엄청나게 어려운 기술인 줄 알고 시작도 전에 포기하는 경우가 많은데 스트림은 엄청 간단하고 유용한 기술이다 다만 설명하는 사람들이 쉬운 걸 너무 어렵

wakestand.tistory.com