성장일기

내가 보려고 정리하는 공부기록

코딩테스트/프로그래머스 Lv.0

[프로그래머스] 길이에 따른 연산 (IntStream, stream.reduce) - JAVA

와나나나 2023. 9. 13. 16:09
728x90

프로그래머스 _ 코딩 기초 트레이닝 DAY 15 - (4)

출처 - https://school.programmers.co.kr/learn/courses/30/lessons/181879

 

프로그래머스

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

programmers.co.kr

문제 |  정수가 담긴 리스트 num_list가 주어질 때, 리스트의 길이가 11 이상이면 리스트에 있는 모든 원소의 합을 10 이하이면 모든 원소의 곱을 return하도록 solution 함수를 완성해주세요.

 

입력 #1 | [3, 4, 5, 2, 5, 4, 6, 7, 3, 7, 2, 2, 1]

출력 #1 | 51


>> 풀이 <<

합인지 곱인지에 따라 초기 변수를 0이나 1로 설정해야 했다. 그래서 나는 여기서 삼항연산자를 사용해 값을 지정하고 시작했다. 그 이후에는 for문과 if문을 활용하여 조건에 맞게 문제를 풀었다!

 

그런데 요즘 stream을 공부하고 있어서 반복문이 아니라 스트림을 이용해 문제를 풀고싶다는 생각이 문득 들었다.

전체적으로 값은 int형이므로 IntStream을 사용해주면 되고, of 메소드를 이용해 스트림을 만들었다.

 

  • 기본형 특화 스트림 (정수) - IntStream
    • IntStream, DoubleStream 등 기본형 특화 스트림을 쓰는 이유는 박싱 과정의 효율성에 있다. 특화 스트림을 쓰면 박싱 비용을 피할 수 있다!
    • of 메소드를 사용해서 스트림에 요소를 넣을 수 있다. IntStream.of()로 사용한다.
  • 복잡한 연산을 가능하게 해주는 메소드 - reduce(리듀싱) 
    • reduce(초깃값(선택), 두 요소 합칠 람다식) 은 스트림의 모든 요소를 소비할 때까지 람다를 반복 수행하면서 최댓값을 생성한다.

스트림을 쓰지 않은 풀이는 다음과 같다.

class Solution {
    public int solution(int[] num_list) {
        int answer = num_list.length >= 11 ? 0 : 1;
        
        for (int i = 0 ; i < num_list.length ; i++) {
            if (num_list.length >= 11) answer += num_list[i];
            else answer *= num_list[i];
        }
        return answer;
    }
}

스트림을 쓴 풀이는 다음과 같다.

import java.util.stream.IntStream;

class Solution {
    public int solution(int[] num_list) {
        IntStream stream = IntStream.of(num_list);
        return num_list.length > 10 ? stream.sum() : stream.reduce(1, (a, b) -> a * b);
    }
}

스트림에서 sum()메소드는 별도로 제공하기 때문에 reduce를 사용하지 않아도 되었다!