새소식

Programmers Coding Test/Java

[프로그래머스 120844] Java - 코딩테스트 입문 / 배열 회전시키기

  • -

 

배열 회전시키기

 

 

 

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

 

프로그래머스

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

programmers.co.kr

 

 

 

 

1)  문제

정수가 담긴 배열 numbers와 문자열 direction가 매개변수로 주어집니다. 
배열 numbers의 원소를 direction방향으로 한 칸씩 회전시킨 배열을 return하도록 solution 함수를 완성해주세요.
제한사항
3 ≤ numbers의 길이 ≤ 20
direction은 "left" 와 "right" 둘 중 하나입니다.

 

 

 

2)  예시

 

 

Result Table
numbers direction result
[1, 2, 3] right [3, 1, 2]
[4, 455, 6, 4, -1, 45, 6] left [455, 6, 4, -1, 45, 6, 4]

 

 

 

입출력 예 #1
numbers 가 [1, 2, 3]이고 direction이 "right" 이므로 오른쪽으로 한 칸씩 회전시킨 [3, 1, 2]를 return합니다.


입출력 예 #2
numbers 가 [4, 455, 6, 4, -1, 45, 6]이고 direction이 "left" 이므로 왼쪽으로 한 칸씩 회전시킨 [455, 6, 4, -1, 45, 6, 4]를 return합니다.

 

 

 

 

 

 

3)  풀이

 

 

 

1. 클래스 선언을 해줍니다

● class Solution {

클래스명은 대문자로 시작해야하고, 정답이라는 의미로 Solution이라는 단어를 사용하였습니다.

 

 

 

 

2. 정수배열 numbers와 문자열 String을 매개변수로 하는 solution 메소드를 선언합니다.

solution은 정수배열를 반환하므로 데이터타입을 int[]로 합니다.

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

 

 

 

 

3. 제한사항을 검사합니다. 제한사항을 만족하지 않을 경우, 예외처리합니다.

●   if(numbers.length < 3 || numbers.length > 20){
            throw new IllegalArgumentException("numbers의 길이는 3이상 20 이하입니다");
        }

 

 

 

4. 정수배열 answer를 만들어줍니다. left 또는 right 방향으로 움직여 만들어진 배열이 담길 것이므로 이 배열 내에 들어가는 원소의 수는 numbers와 동일하므로, 크기는 numbers.length와 동일하게 생성합니다.

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

 

 

 

 

4. 우선 right의 경우를 확인해봅시다.

String의 비교는 == 등호가 아닌, equals 메소드를 이용합니다.

right일 경우, numbers의 마지막 요소가 answr의 첫번째 요소가 되고, 그 외는 한칸씩 우측으로 가니 index에 +1을 해주면 됩니다.

 

left의 경우, numbers의 첫번째 요소가 answer의 마지막 요소가 되고, 그 외는 한칸씩 좌측으로 가니 index에 -1씩 되게, 즉 numbers에 +1을 해주면 동일한 의미가 되겠습니다.

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

 

 

 

 

4)  코드

 

class Solution {
    public int[] solution(int[] numbers, String direction) {
        if(numbers.length < 3 || numbers.length > 20){
            throw new IllegalArgumentException("numbers의 길이는 3이상 20 이하입니다");
        }
        int[] answer = new int[numbers.length];
        
        if(direction.equals("right")){
            for(int i = 0; i < numbers.length - 1; i++){
                answer[i + 1] = numbers[i];
            }
            answer[0] = numbers[numbers.length - 1];
        } else if(direction.equals("left")){
            for(int i = 0; i < numbers.length - 1; i++){
                answer[i] = numbers[i + 1];
            }
            answer[numbers.length - 1] = numbers[0];
        }
        
        return answer;
    }
}

 

 

 

 

 

 

 

5)  느낀점

좌우측으로 if문을 나누고, index 변경까지 완료했지만 정답이 아니었습니다.

그 이유는?!

바로 answer 배열 생성시 원소의 크기를 설정해주지 않고 빈배열로 생성했을 뿐만 아니라, for문 내에 첫번째요소, 마지막요소값을 넣어주어서 오류가 발생하였습니다.

또한, numbers.length 인덱스가 아닌 numbers.length -1의 인덱스를 사용해야하는 부분에도 착오가 있었습니다.

세개의 오점을 해결하고나니 정답에 도달할 수 있었습니다.

간단한 문제였으나, 생성단계, 조건 및 반복문 에서 선언문의 위치에 대해 다시 한번 점검하는 마음가짐을 가지게 되었습니다.

 

 

 

 

 

 

 

 

 

 

 

 

 

Contents

포스팅 주소를 복사했습니다

이 글이 도움이 되었다면 공감 부탁드립니다.