문제 설명
정수 리스트 num_list와 정수 n이 주어질 때, num_list를 n 번째 원소 이후의 원소들과 n 번째까지의 원소들로 나눠 n 번째 원소 이후의 원소들을 n 번째까지의 원소들 앞에 붙인 리스트를 return하도록 solution 함수를 완성해주세요.
제한사항
- 2 ≤ num_list의 길이 ≤ 30
- 1 ≤ num_list의 원소 ≤ 9
- 1 ≤ n ≤ num_list의 길이
입출력 예
num_list | n | result |
[2, 1, 6] | 1 | [1, 6, 2] |
[5, 2, 1, 7, 5] | 3 | [7, 5, 5, 2, 1] |
import java.util.stream.IntStream;
import java.util.Arrays;
class Solution {
public int[] solution(int[] num_list, int n) {
// index로 작업할 거니까 intstream으로 시작한다.
// range로 범위 정한다. num_list가 배열이라 length만 쓴다.
int[] part1 = IntStream.range(n, num_list.length)
// num_list가 배열이라 maptoobj 아니고 map 쓴다.
.map(i -> num_list[i])
// 'int'[]를 리턴하는 거라서 ::new 같은 거 필요 없다. 그냥 toArray()만 해도 된다.
.toArray();
int[] part2 = IntStream.range(0, n)
.map(i -> num_list[i])
.toArray();
// stream으로 concat한다.
int[] answer = IntStream.concat(Arrays.stream(part1), Arrays.stream(part2))
.toArray();
return answer;
}
}
배열과 배열을 concat할 땐 arraycopy를 쓰는 게 좋다.
왜? 그게 더 성능에 좋으니까.
내가 그걸 안 쓴 건, arraycopy에 안 익숙해서(자바 잘 못 해서? ㅠㅠ)...
int[] arr1 = {1, 2, 3};
int[] arr2 = {4, 5, 6};
int[] result = new int[arr1.length + arr2.length];
// arr1의 0인덱스에서 result의 0인덱스부터 arr1.length==arr1의 요소수를 복사한다.
System.arraycopy(arr1, 0, result, 0, arr1.length);
// arr2의 0인덱스에서 result의 arr1.length인덱스부터 arr2의 요소수를 복사한다.
System.arraycopy(arr2, 0, result, arr1.length, arr2.length);
즉, {1, 2, 3, 4, 5, 6} 이렇게 됨.
프로그래머스의 홍희표좌의 코드를 보자.
import java.util.Arrays;
class Solution {
public int[] solution(int[] numList, int n) {
int[] copy = Arrays.copyOf(numList, numList.length * 2);
System.arraycopy(numList, 0, copy, numList.length, numList.length);
return Arrays.copyOfRange(copy, n, n + numList.length);
}
}
돌았다.
1 2 3 4 5가 있으면 1 2 3 4 5 1 2 3 4 5를 만들고
n을 기준으로 4 5 1 2 3되게 만든 격.
이걸 stream 안 쓰고 평범하게 풀었다는 댓글이 있던데 왜 그러겠는가?
arraycopy가 더 성능이 좋으니까...
가장 추천이 많았던 코드는 다음과 같다.
import java.util.stream.IntStream;
class Solution {
public int[] solution(int[] num_list, int n) {
return IntStream.range(0, num_list.length).map(i -> num_list[(i + n) % num_list.length]).toArray();
}
}
이 코드는 1 2 3 4 5가 있을 때 n이 2면 그걸 index로 잡아서 1 2를 3 4 5 뒤에 붙인다.
진~짜 단순하고 상식적인데 왜 나는 이렇게 생각을 못 했을까???
위 두 코드는 이들과 나의 체급 차이를 명확하게 느끼게 해 주는 코드다.