Algorithm/Programmers

[Programmers] Lv.0 / 배열 만들기 3 / Java

unknownomad 2023. 12. 5. 23:55

문제

 

풀이

import java.util.Arrays;

class Solution {
    public int[] solution(int[] arr, int[][] intervals) {
        
        int[] interval1 = Arrays.copyOfRange(arr, intervals[0][0], intervals[0][1] + 1);
        int[] interval2 = Arrays.copyOfRange(arr, intervals[1][0], intervals[1][1] + 1);

        int[] answer = new int[interval1.length + interval2.length];

        System.arraycopy(interval1, 0, answer, 0, interval1.length);
        System.arraycopy(interval2, 0, answer, interval1.length, interval2.length);

        return answer;
    }
}

Arrays.copyOfRange(T[] original, int from, int to)

  • original: 복사할 배열
  • from: 복사할 시작 인덱스(포함)
  • to: 복사할 끝 인덱스(제외)

System.arraycopy(Object src, int srcPos, Object dest, int destPos, int length)

  • src: 복사할 배열
  • srcPos: 원본 배열에서 복사를 시작할 인덱스
  • dest: 복사된 요소를 저장할 배열
  • destPos: 대상 배열에서 복사를 시작할 인덱스
  • length: 복사할 요소의 개수

 

import java.util.*;

class Solution {
    public int[] solution(int[] arr, int[][] intervals) {
        return Arrays.stream(intervals)
            .flatMapToInt(ints -> Arrays.stream(Arrays.copyOfRange(arr, ints[0], ints[1] + 1)))
            .toArray();
    }
}

for loop vs Stream

속도

for loop Stream
  • 보통 for loop 가 Stream 보다 빠름
  • Stream 이 추가적인 오버헤드를 가지기 때문
  • 그러나 대용량 데이터나 복잡한 연산을 처리하는 경우, Stream 의 parallelStream() 메소드로 병렬 처리해 성능 향상시킬 수 있음

코드 가독성

for loop Stream
  • 전통적인 방식으로 코드가 길어질 수 있고, 복잡한 연산을 수행하려면 추가 코드 작성 필요할 수 있음
  • 함수형 프로그래밍 패러다임 따르기에 코드가 간결하고 가독성 좋음, 또한 filter(), map(), reduce() 등 메소드 체이닝해 복잡한 연산 쉽게 구현 가능

부작용(Side-effects)

for loop Stream
  • 변수의 상태 변경 등 부작용 발생 가능성 있음
  • 함수형 프로그래밍 패러다임을 따르므로 부작용 없이 데이터 처리가 가능

결론

for loop Stream
  • 속도와 효율성에서 우세
  • 가독성과 유지 보수 측면에서 우세

 

출처

https://school.programmers.co.kr/learn/courses/30/lessons/181895