배열 회전시키기
https://school.programmers.co.kr/learn/courses/30/lessons/120844
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의 인덱스를 사용해야하는 부분에도 착오가 있었습니다.
세개의 오점을 해결하고나니 정답에 도달할 수 있었습니다.
간단한 문제였으나, 생성단계, 조건 및 반복문 에서 선언문의 위치에 대해 다시 한번 점검하는 마음가짐을 가지게 되었습니다.