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

<예시 입출력>

<문제 해결 과정>
temp를 통해 값을 간단히 회전시키면 될 것 같았다.
Try 1)
// IDE에서는 정상 출력이 되었으나, 프로그래머스 플랫폼에서 코드실행을 하면 실행값이 모두 0으로 출력되는 현상
int[] answer = new int[numbers.length];
int length = numbers.length;
int last = length - 1;
int temp = 0;
if(direction == "right") {
// 임시저장소에 끝값을 저장
temp = numbers[last];
// 범위 처리는 last로 하여 OutOfIndex가 일어나지 않도록 한다.
for(int i = 0; i < last; i++) {
numbers[last - i] = numbers[last - (i + 1)];
}
// 첫 인덱스에 끝값을 삽입
numbers[0] = temp;
// answer에 모든 값 대입
for(int i = 0; i < length; i++) {
answer[i] = numbers[i];
}
}
else {
// 임시저장소에 첫 값을 저장
temp = numbers[0];
// 범위 처리는 last로 하여 OutOfIndex가 일어나지 않도록 한다.
for(int i = 0; i < last; i++) {
numbers[i] = numbers[i+1];
}
// 끝 인덱스에 첫값을 삽입
numbers[last] = temp;
// answer에 모든 값 대입
for(int i = 0; i < length; i++) {
answer[i] = numbers[i];
}
}
return answer;
// 테스트케이스
// {1,2,3}, right이면
// i = 0, numbers[2 - 0] = numbers[2 - 1]; >> numbers[2] = numbers[1]
// >> {1, 2, 2}
// i = 1, numbers[2 - 1] = numbers[2 - 2]; >> numbers[1] = numbers[0]
// >> {1, 1, 2}
//
// >> 값 추가 코드로 {3, 1, 2}
// 테스트케이스
// {1,2,3}, left이면
// i = 0, numbers[0] = numbers[1]
// >> {2, 2, 3}
// i = 1, numbers[1] = numbers[2]
// >> {2, 3, 3}
//
// >> 값 추가 코드로 {2, 3, 1}
테스트케이스 별로 조건문을 일치시켜보며 풀어보고자 하였다.
IDE상에선 정상 출력되었지만 채점사이트에서는 통과하지 못하여 다시 풀어보았다.
Try 2)
List<Integer> temp = new ArrayList<>();
for(int i = 0; i < numbers.length; i++) {
temp.add(i, numbers[i]);
}
System.out.println(temp);
if(direction == "right") {
// temp 리스트를 우측으로 (한번) 밀어버린다.
Collections.rotate(temp, 1);
}
else if(direction == "left") {
Collections.rotate(temp, -1);
}
for(int i = 0; i < temp.size(); i++){
answer[i] = temp.get(i);
}
// 배열로 처리하기보다 리스트로 넣고 리스트의 Collections클래스를 활용하여 rotate 메서드를 사용하였다.
// >> 여전히 이클립스에서는 정상통과하나, 프로그래머스에서는 통과하지 못하였다.
Collections클래스의 rotate()메서드를 지원하지 않을 수 있으니 다른 풀이로 풀어보았다.
Try 3)
List<Integer> temp = new ArrayList<>();
for(int i = 0; i < numbers.length; i++) {
temp.add(i, numbers[i]);
}
if(direction == "right") {
temp.add(0, temp.get(temp.size() - 1));
temp.remove(temp.size() - 1);
}
else if (direction == "left"){
temp.add(temp.size(), temp.get(0));
temp.remove(0);
}
for(int i = 0; i < temp.size(); i++){
answer[i] = temp.get(i);
}
Collections클래스의 rotate 메서드를 지원하지 않는 것 같아 직접 추가, 삭제 해보기로하였다.
Try 3)을 진행하면서 느낀것은 if(direction == "right") 부분을 해석하지 못한다는 것이었다.
direction이 left일때 else로 처리해보니 정상적으로 통과되었지만, else if(direction == "left") 로 바꾸니
통과하지 못한다는 것을 확인하였다.
Solution 1)
if(direction.contains("right")) {
temp.add(0, temp.get(temp.size() - 1));
temp.remove(temp.size() - 1);
}
else {
temp.add(temp.size(), temp.get(0));
temp.remove(0);
}
direction의 문자열 검사 문제임을 깨닫고 문자열 포함 메서드인 contains로 다시 시도해보니 해결되었다.
Solution 2)
int[] answer = new int[numbers.length];
int length = numbers.length;
int last = length - 1;
int temp = 0;
if(direction.contains("right")) {
// 임시저장소에 끝값을 저장
temp = numbers[last];
for(int i = 0; i < last; i++) {
numbers[last - i] = numbers[last - (i + 1)];
}
// 첫 인덱스에 끝값을 삽입
numbers[0] = temp;
// answer에 모든 값 대입
for(int i = 0; i < length; i++) {
answer[i] = numbers[i];
}
}
else {
// 임시저장소에 첫 값을 저장
temp = numbers[0];
for(int i = 0; i < last; i++) {
numbers[i] = numbers[i+1];
}
// 끝 인덱스에 첫값을 삽입
numbers[last] = temp;
// answer에 모든 값 대입
for(int i = 0; i < length; i++) {
answer[i] = numbers[i];
}
}
return answer;
응용하여 Solution 1)이 Try 1)에도 적용되는지 테스트해보았다. >> contains조건문 수정으로 해결이 되었다.
문제는 조건문 처리 시 문자열을 '==' 논리연산자로 처리해보고자 하였으나, 여기서 문제가 발생하였다.
이 또한 contains 메서드를 사용하여 해결할 수 있었다.
<전체코드>
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
public class rotate_arrays {
public static int[] solution(int[] numbers, String direction) {
int[] answer = new int[numbers.length];
List<Integer> temp = new ArrayList<>();
for(int i = 0; i < numbers.length; i++) {
temp.add(i, numbers[i]);
}
if(direction.contains("right")) {
temp.add(0, temp.get(temp.size() - 1));
temp.remove(temp.size() - 1);
}
else {
temp.add(temp.size(), temp.get(0));
temp.remove(0);
}
for(int i = 0; i < temp.size(); i++){
answer[i] = temp.get(i);
}
return answer;
}
public static void main(String[] args) {
//int[] numbers = {1,2,3};
int[] numbers = {4, 455, 6, 4, -1, 45, 6};
//String direction = "right";
String direction = "left";
System.out.println(Arrays.toString(solution(numbers, direction)));
}
}
문자열을 찾는 조건에서 == 연산보다 contains()연산을 통해서 해결한 점이 이번 풀이에서 배운 점이었다.
문제링크)
https://school.programmers.co.kr/learn/courses/30/lessons/120844
프로그래머스
코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.
programmers.co.kr
'Algorithms > 프로그래머스' 카테고리의 다른 글
[프로그래머스] '팩토리얼' - Java (0) | 2023.05.01 |
---|---|
[프로그래머스] '주사위의 개수' - Java (0) | 2023.04.30 |
[프로그래머스] '공 던지기' - Java (1) | 2023.04.29 |
[프로그래머스] '구슬을 나누는 경우의 수' - Java (1) | 2023.04.29 |
[프로그래머스] '2차원으로 만들기' - Java (0) | 2023.04.28 |