배열의 원소만큼 추가하기

김아무개·2023년 5월 14일
0

프로그래머스

목록 보기
39/41

그냥 풀면 쉬운 문제인데
Stream을 사용하려고 하니까 너무 어려운 문제였다.

Chat 코드 🙈

import java.util.Arrays;
import java.util.stream.IntStream;
class Solution {
    public int[] solution(int[] arr) {
        return Arrays
                .stream(arr)
                .boxed()
                .flatMapToInt(i -> IntStream.range(0, i).map(n -> i))
                .toArray();
    }
}

int 배열을
boxed()를 사용해서 wrapper 객체 배열로 변환 한 뒤,

flatMapToInt() 메서드를 사용하여 값을 만들고

toArray() 메서드를 사용하여 int배열로 반환하는 코드를 만들어냈다.

flatMapToInt() 메서드에 대해서 전혀 감이 안오는데;
이것을 사용하는 부분에 대해서 좀 더 공부해 봐야겠다!


flatMapToInt()

wrapper 객체 배열에서 사용할 수 있는 메서드이다.

맨 마지막줄에 있는 flatMapToInt

IntStream flatMapToInt(Function<? super T, ? extends IntStream> mapper);

T를 입력받아서 하나의 IntStream 을 반환하는 메서드이다.

이 말은
T가 분명히 1개 이상 들어올테니 IntStream도 1개 이상이 될 건데,
여러개의 IntStream을 flatMapToInt가 단 하나의 IntStream으로 합쳐준다.

오오, 어려운데 너무 유용하다는 생각이 들었다.
여러번 풀어봐야겠다!


IntStream.range(0, i).map(n -> i)

하나씩 분해해 본다면

IntStream.range(0, i)

0에서 i-1까지의 연속된 정수를 갖는 IntStream을 반환한다.
ex) i = 3이면, 반환 값은 0,1,2

.map(n -> i)

n을 i로 반환한다.

range에서 넘어온 값을 map에서 처리하기 때문에
map에는 0,1,2가 들어온다.

하지만 map에서는 들어오는 값 n을 i로 변환하기 때문에
map의 반환값은 3,3,3을 갖는 IntStream이 된다.

따라서
flatMapToInt(i -> IntStream.range(0, i).map(n -> i)) 문장은
arr이 [ 5 , 1 , 4 ]일 때

[ 5 , 5 , 5 , 5 , 5 ] 인 IntStream 과,
[ 1 ] 인 IntStream ,
[ 4 , 4 , 4 , 4 ] 인 IntStream 을

하나의 IntStream으로 합쳐서 [ 5 , 5 , 5 , 5 , 5 , 1 , 4 , 4 , 4 , 4 ]를 만들어 준다



이것도 오랜만에 작성해보네 😊
오랜만에 작성하는 김에 업데이트 쳐봄 ㅋㅋ
한번 풀 때 마다 🔵 하나씩 지우기


다시 풀어봐야됨

23년 5월
시도한 날짜 : 14, 15, 16, 17, 18, 22
실패한 날짜 : 14
성공한 날짜 : 15, 16, 17, 18, 22

profile
Hello velog! 

0개의 댓글