배열 회전시키기

이윤설·2024년 2월 15일
0

제출코드(오답)

class Solution {
    public int[] solution(int[] numbers, String direction) {

        int length = numbers.length;
        int[] array = new int[length];

        String right = "right";
        String left = "left";

        if (direction.equals(right)) {
            for (int i = 0; i < numbers.length; i++) {
                if (numbers[i] == numbers.length) {
                    array[0] = numbers[i]; // 2 -> 0
                } else {
                    array[i + 1] = numbers[i]; // 0 -> 1 , 1 -> 2
                }
            }
        }

        if (direction.equals(left)) {
            for (int i = 0; i < numbers.length; i++) {
                if (numbers[i] == 0) {
                    array[length - 1] = numbers[i];
                } else {
                    array[i - 1] = numbers[i];
                }
            }
        }
        return array;
    }
}

outofbound 에러가 나기도하고, 여러모로 별로.

모범답안

class Solution {
    public int[] solution(int[] numbers, String direction) {
        int length = numbers.length;
        int[] array = new int[length];

        if ("right".equals(direction)) {
            array[0] = numbers[length - 1]; // 마지막 원소를 첫 번째로 이동
            for (int i = 0; i < length - 1; i++) { // 나머지 원소를 한 칸씩 오른쪽으로 이동
                array[i + 1] = numbers[i];
            }
        } else if ("left".equals(direction)) {
            array[length - 1] = numbers[0]; // 첫 번째 원소를 마지막으로 이동
            for (int i = 1; i < length; i++) { // 나머지 원소를 한 칸씩 왼쪽으로 이동
                array[i - 1] = numbers[i];
            }
        }

        return array;
    }
}

모범답안2

class Solution {
    public int[] solution(int[] numbers, String direction) {
        int length = numbers.length;
        int[] array = new int[length];

        if ("right".equals(direction)) {
            array[0] = numbers[length - 1]; // 마지막 원소를 첫 번째로 이동
            System.arraycopy(numbers, 0, array, 1, length - 1); // 나머지 원소를 한 칸씩 오른쪽으로 이동
        } else if ("left".equals(direction)) {
            array[length - 1] = numbers[0]; // 첫 번째 원소를 마지막으로 이동
            System.arraycopy(numbers, 1, array, 0, length - 1); // 나머지 원소를 한 칸씩 왼쪽으로 이동
        }

        return array;
    }
}

배운점

  • right -> 마지막 원소를 첫번째로 이동 -> 나머지 원소를 한칸씩 오른쪽으로 이동. 이때, 반복횟수는 length - 1이다. 왜냐하면 이미 마지막 원소를 옮겼기 때문에 마지막 원소 바로 이전에 반복문이 멈춘다.

  • System.arraycopy 는 byte[] 형태의 데이터를 자르거나 연접하기 위해 사용하는 메소드다. System.arraycopy 파라미터는 총 5개 요소가 들어간다.

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

Object src : 복사하고자 하는 소스. 원본이라고 생각하면 된다.

int srcPos : 위의 원본 소스에서 어느 부분부터 읽어올지 위치를 정한다. 처음부터 데이터를 읽어올거면 0 을 넣자.

Object dest : 복사할 대상이다.

int destPos : 위의 복사본에서 자료를 받을 때, 어느 부분부터 쓸 것인지 시작 위치를 정한다. 처음부터 데이터를 쓸 거면 0 을 넣자.

int length : 원본에서 복사본으로 데이터를 읽어서 쓸 데이터 길이다.
원본에서 복사본까지 얼마큼 읽어 올지 입력하는 것이다.

profile
화려한 외면이 아닌 단단한 내면

0개의 댓글