본문 바로가기

프로그래머스 - 코딩테스트

[Java][프로그래머스] - LVL.0 배열 자르기


정답 1

IntStream 에 range 를 사용해 주어진 num1, num2 인덱스 만큼의 numbers 요소를 map 을 통해 공정해준뒤 toArray() 메서드를 사용해 int[] 배열러 만들어 return 해주었다.

import java.util.stream.IntStream;

class Solution {
    public int[] solution(int[] numbers, int num1, int num2) {
        return IntStream.range(num1, num2+1).map(num -> numbers[num]).toArray();
    }
}

여기서 한가지!

IntStream, LongStream 에는 range 외에 rangeClosed 라는 메서드 또한 존재한다.

상기 답안에서는 rangeClosed 를 사용하는게 좀더 깔끔했을 것이다. 그럼 뒤에 num2 + 1 을 해줄필요가 없기 때문이다.

range 는 종료값을 포함하지 않지만 rangeClosed 는 종료값을 포함한다.

그래서 range 1, 3 은 -> [1, 2] 인 반면 rangeClosed 1, 3 은 -> [1, 2, 3] 인 것이다.

import java.util.stream.IntStream;

class Solution {
    public int[] solution(int[] numbers, int num1, int num2) {
        return IntStream.rangeClosed(num1, num2).map(num -> numbers[num]).toArray();
    }
}

이렇게 되는게 깔끔하다.

결과는 정답이었다!!

자신감있게 다른사람들의 답을 보았다. 와!! Array 에 copyOfRange 라는게 있었다.


정답 2

import java.util.*;

class Solution {
    public int[] solution(int[] numbers, int num1, int num2) {
        return Arrays.copyOfRange(numbers, num1, num2 + 1);
    }
}

와,, 너무 깔끔하다.

 

Arrays.copyOfRange(T [ ], int from, int to) : Copies the specified range of the specified array into a new array.
-> 인자로 받은 array의 index int from 에서 int to 바로 전까지의 array를 copy 하여 새로운 array에 담아서 반환.

 

copyOfRange 도 잘 기억해두면 금방 요긴하게 사용할 때가 있을 것 같다.