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

프로그래머스 “배열 회전시키기” 문제 해결과정입니다.

배열 회전시키기

문제 설명

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

제한 사항

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

입출력 예

numbersdirectionresult
[1, 2, 3]“right”[3, 1, 2]
[4, 455, 6, 4, -1, 45, 6]“left”[455, 6, 4, -1, 45, 6, 4]

문제 해결과정

본인은 프로그래머스에서 코드를 작성하기에 어려움을 느껴 먼저 이클립스에서 코드를 실행하고 확인 후 프로그래머스 웹 텍스트 에디터로 옮기는 작업을 했다. 이클립스에서 클래스 파일을 생성하고 main에서 실행하여 확인하였다.

이클립스 코드

package Practice;

import java.util.Arrays;

public class practice {
	public static void main(String[] args) {
	
	    int[] answer = {};
	    int[] numbers = {1,2,3}; // INDEX 0,1,2
	    String direction = "left";
	    

	    if(direction.equals("right")){
	        int sizeR = numbers.length; // 3
//	        System.out.println("sizeR : " + sizeR);
//	        System.out.println("numbers[2] : " + numbers[2]); // 3
//	        System.out.println("numbers[sizeR] : " + numbers[sizeR - 1]); // 3
	        int a = numbers[sizeR - 1];
	        System.out.println("a : " + a);
	        for(int i = sizeR-1; i > 0; i--){
//		        System.out.println("numbers[i] : " + numbers[i]); // 3
//		        System.out.println("numbers[] : " + numbers[sizeR - 1]); // 3
	            numbers[i] = numbers[i-1];
	        }
//	        System.out.println("a : " + a);
	        numbers[0] = a;
//	        System.out.println("numbers[0] : " + numbers[0]); // 3
//	        System.out.println("numbers[1] : " + numbers[1]); // 1
//	        System.out.println("numbers[2] : " + numbers[2]); // 2
//	        System.out.println("numbers" + numbers);
	        answer = numbers;
//	        System.out.println("answer : " + answer);  [I@68fb2c38 ?
	        System.out.println("answer : " + Arrays.toString(answer));
//	        return answer;
	    }else{ //left
	    	int sizeL = numbers.length; // 3
	        int b = numbers[0];
	        System.out.println("b : " + b);
	        for(int i = 1; i < sizeL; i++){
	            numbers[i-1] = numbers[i];
	        }
	        numbers[sizeL-1] = b;
	        answer = numbers;
	        System.out.println("answer : " + Arrays.toString(answer));
//	        return answer;
	    }
	}
}

먼저 예시로 주어진 변수들을 선언한다. numbers와 direction을 설정해주었다. 이후에 direction을 ‘right’와 ‘left’로 구분짓고 각 상황에 따른 코드를 작성했다. direction이 right일 경우 배열 {1,2,3}이 오른쪽으로 움직여 {3,1,2} 가 되어야 한다. 그래서 먼저 변수 ‘a’를 선언해 ‘3’을 저장해 두었다. 이후 numbers의 총 길이를 ‘sizeR’에 저장했다. 배열의 사이즈나 인덱스 위치가 헷갈려 print문으로 하나하나 확인하며 진행하였다. 오른쪽으로 이동하는 경우는 3이 저장되고 1과 2가 이동된 뒤에 맨 처음 인덱스에 3을 저장해주면 된다. 이 과정에서 2(sizeR – 1)에서 i가 0보다 클 때까지(2번) 이동되도록 for문을 작성해 옮겨 주었다. left의 경우도 똑같이 진행해주었다. 이후에 잘 들어갔는지 print문으로 확인하였다.

그런데 이클립스에서 배열을 출력하니 넣어둔 배열이 리스트 형식으로 출력 되는 것이 아니라 ‘[I@68fb2c38’의 문자열 출력되었다. 이유를 찾아보니 이는 배열의 형식을 출력하는 것으로 I는 1차원 int를 의미하고 ‘@’ 뒤에 나오는 16진수는 배열의 주소인데 실제 주소가 아닌 내부 주소를 의미한다고 한다. 어쨌든 이를 해결하는 방법에는 ‘Arrays.toString’을 사용하여 곧바로 해결되었다.

프로그래머스 코드

class Solution {
    public int[] solution(int[] numbers, String direction) {
    	    int[] answer = {};
	 
	    if(direction.equals("right")){
	        int sizeR = numbers.length;
	        int a = numbers[sizeR - 1];
	        System.out.println("a : " + a);
	        for(int i = sizeR-1; i > 0; i--){
	            numbers[i] = numbers[i-1];
	        }
	        numbers[0] = a;
	        answer = numbers;
	        return answer;
	    }else{ //left
	    	int sizeL = numbers.length; // 3
	        int b = numbers[0];
	        System.out.println("b : " + b);
	        for(int i = 1; i < sizeL; i++){
	            numbers[i-1] = numbers[i];
	        }
	        numbers[sizeL-1] = b;
	        answer = numbers;
            return answer;
	    }
	}
}

프로그래머스 코드에서는 쓸데없는 print 문과 선언했던 변수들을 지워 실행했다. 그런데 프로그래머스에서는 ‘Arrays.toString’ 인식이 되지 않아 지우고 실행했더니 잘 마무리 되었다.

참고 – https://gksdudrb922.tistory.com/133

최신글

댓글 남기기

광고 차단 알림

광고 클릭 제한을 초과하여 광고가 차단되었습니다.

단시간에 반복적인 광고 클릭은 시스템에 의해 감지되며, IP가 수집되어 사이트 관리자가 확인 가능합니다.