🗃️javascript/프로그래머스

배열 회전시키기(Lv.0)[간단배열이동 적용끝판왕, slice(),splice() 상세설명]

하얀성 2023. 1. 4. 16:12

<문제 설명>

정수가 담긴 배열 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]

입출력 예 설명

입출력 예 #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합니다.

<제출 답안>

계속 안되서 순서 대충 적음

1. 맨 뒤 숫자를 빼낸다.
2. 모든 숫자를 한칸식 뒤로 옮긴다.
3. 맨 뒤 빼낸 숫자를 맨 앞에 붙인다.

각 순서를 구현내줄 만한 함수를 찾아서~~

-slice(자르고 싶은 곳 시작, 자르고 싶은 곳 끝지점+1) 
-splice(자르고 싶은 곳 시작, 삭제할 갯수, 대체할 내용) ->  적용시킨 배열을 출력하면 변경되서 출력

 

slice는 그저. 자른 것들만을 모아 만든 배열을 출력 (slice로 편집당한 기존 배열의 '요소'들을 출력)

splice는 아예 기존 배열의 요소를 바꾸거나, 빈 공간으로 만들어서 출력(splice로 편집된 상태의 '기존 배열'을 출력)

 

function solution(numbers, direction) {
    const x = numbers.slice(numbers.length-1)
    const y = numbers.slice(0,1)
    
    if(direction == 'right'){
        for(let i= numbers.length-1; i >= 1; i--) {
            numbers[i] = numbers[i-1]
        }
        numbers[0] = Number(x)
    }else {
        for(let i = 0; i<= numbers.length-2; i++ ){
            numbers[i] = numbers[i+1]
        }
        numbers[numbers.length-1] = Number(y)
    }
    
    return numbers 
}

 

코드가 복잡하다. 알고리즘 강의해서 강사님이 설명한대로 구현해보았다.

이 '배열회전시키기' 문제는 java 백준 때 나와 악연이였고 못 풀어냈으나, 여기 js에서는 좀 오래 걸렸지만 내스스로 끝장을 봤다.

 

 

아니... return numbers.unshift(numbers.pop()) 시험삼아 해줬더니 pop한 3만 나오길래 안되는 줄 알았더니..

이렇게 넣어주면 되는 것이었다... 알아서 한칸씩 밀어주네..ㅎㅎ;

function solution(numbers, direction) {
    var answer = [];

    if ("right" == direction) {
        numbers.unshift(numbers.pop());
    } else {
        numbers.push(numbers.shift());
    }

    answer = numbers;

    return answer;
}