본문 바로가기
코딩테스트 연습

순서 바꾸기

by 신재은👩🏼‍💻 2024. 4. 11.

문제 설명

정수 리스트 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 뒤에 붙인다.

진~짜 단순하고 상식적인데 왜 나는 이렇게 생각을 못 했을까???

 

위 두 코드는 이들과 나의 체급 차이를 명확하게 느끼게 해 주는 코드다.

'코딩테스트 연습' 카테고리의 다른 글

l로 만들기  (0) 2024.04.12
부분 문자열 이어 붙여 문자열 만들기  (0) 2024.04.11
5명씩  (0) 2024.04.11
할 일 목록  (0) 2024.04.11
ad 제거하기  (0) 2024.04.11