코딩테스트 회고록/코테_Java

[JAVA] 프로그래머스 - 배열 회전시키기

iamjisu 2023. 3. 7. 00:49

프로그래머스 코딩테스트 연습 입문단계 '배열 회전시키기' 문제입니다.

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

 

프로그래머스

코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.

programmers.co.kr


❓ 문제 설명

정수가 담긴 배열 numbers와 문자열 direction가 매개변수로 주어집니다. 배열 numbers의 원소를 direction방향으로 한 칸씩 회전시킨 배열을 return하도록 solution 함수를 완성해주세요.

 

※ 아래 입출력 예시를 참고하세요!


⚠️ 제한사항 및 입출력 예시

  • 3 ≤ numbers의 길이 ≤ 20
  • direction은 "left" 와 "right" 둘 중 하나입니다.

입출력 예시 ▼

 

입력 (numbers, direction)

[1, 2, 3]  /  "right"

출력 (return값)

[3, 1, 2]

✏️ 직접 구현한 코드

class Solution {
    public int[] solution(int[] numbers, String direction) {
        int[] answer = new int[numbers.length];
        if(direction.equals("left")) {
            for(int i = 1; i < numbers.length; i++) {
                answer[i-1] = numbers[i];
            }
            answer[answer.length-1] = numbers[0];
        } else {
            for(int i = 0; i < numbers.length-1; i++) {
                answer[i+1] = numbers[i];
            }
            answer[0] = numbers[answer.length-1];
        }
        return answer;
    }
}

🗣️ 코드 설명

  • 최종 결과를 저장할 answer배열을 numbers배열의 크기로 생성했습니다.
  • if문안에서 문자열을 비교해야하므로 equals() 메서드를 이용했습니다.
  • 만약 direction값이 left라면, for문을 이용해 answer[0]에 numbers[1]의 값을 넣고 answer[1]에  numbers[2]를 넣는 것을 반복합니다.
  • answer배열의 마지막에서 두 번째 방까지 값을 다 넣은 후 for문을 나와서 answer배열의 마지막 방에 numbers배열의 0방 값을 저장합니다. 이렇게 "left"로 이동하게 했습니다.
  • 만약 direction값이 right라면, for문을 이용해 answer[1]에 numbers[0]의 값을 넣고 answer[2]에  numbers[1]를 넣는 것을 반복합니다.
  • answer배열의 마지막 방까지 값을 다 저장한 후 for문을 나옵니다. for문을 나온 뒤에 answer[0]에 numbers배열의 마지막방 값을 저장하여 "right"로 이동하게 됩니다.

🔥다른 사람의 코드

import java.util.*;

class Solution {
    public ArrayList solution(int[] numbers, String direction) {
        ArrayList<Integer> answer = new ArrayList<Integer>();

        for(int i=0; i<numbers.length; i++){
            answer.add(numbers[i]);
        }

        int targetValue = 0;

        if(direction.equals("right")){
            answer.add(0, numbers[numbers.length-1]);
            answer.remove(answer.size()-1);

        }else{
            answer.add(numbers[0]);
            answer.remove(0);
        }

        return answer;
    }
}

이 사람은 ArrayList를 이용해 for문을 사용하지 않고 배열의 순서를 바꿨습니다.

코드를 분석해보자면,

  • 먼저 ArrayList인 answer에 numbers배열의 값을 다 복사했다.
  • direction이 right일때는 answer 가장 앞에 numbers배열의 마지막 방의 값을 add하고, answer의 마지막 방의 값을 remove한다.
  • direction이 left일때는 answer 가장 뒤에 number[0] 값을 add하고, answer의 가장 앞에 있는 값을 remove했다.

 

 

아직 List를 어떤 문제에 써야하는지 감이 잡히지 않았다. 문제들을 풀 때 List를 사용하면 더 효율적인 코드가 되지는 않나 확인을 먼저 해봐야겠다 :)