[Algorithm]배열 회전시키기(programmers)

Intro

회전 문제를 풀 때 인덱싱과 슬라이싱을 사용했는데 다른 사람들은 deque 사용한 풀이가 있어 같이 정리한다.

문제

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

입출력 예시

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. 임시변수(temp)를 활용하여 각각의 번지에 있는 값을 바꾸려 했음. -> 이 방법으로 처리하려다 보니 너무 복잡하게 처리되어서 해결하지 못했음.

참고한 풀이

  1. numbers라는 파라미터에 인덱싱과 슬라이싱을 이용하여 접근한 뒤 새로운 배열에 append 하는 방법
  2. deque를 활용하여 rotate 함수를 사용하는 방법.

1번 풀이 코드(인덱싱, 슬라이싱 사용)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
def solution(numbers, direction):
    answer = []
    if direction == 'right':
        print('right')
        # 마지막 번지에 있는 값이 정답의 첫 번째에 와야 함.
        answer.append(numbers[-1])
        # 이후에 마지막 번지를 제외한 값들이 차례대로 answer에 들어가면 된다.
        for i in numbers[0:-1]:
            answer.append(i)
    else:
        # 왼쪽으로 이동 시 0번지를 제외한 값들이 순차대로 들어간 후 0번지가 마지막에 answer에 들어가면 정답.
        for i in numbers[1:]:
            answer.append(i)
        answer.append(numbers[0])
    return answer
solution([1,2,3],'right') 
# 결과 : [3, 1, 2]

2번 풀이 코드(deque 사용)

1
2
3
4
5
6
7
8
9
10
11
12
13
def solution(numbers, direction):
    # deque 자료구조로 변환.
    numbers = deque(numbers)
    # 오른쪽일 경우 양수
    if direction == 'right':
        numbers.rotate(1)
    # 왼쪽일 경우 음수
    else:
        numbers.rotate(-1)
    # deque를 다시 list로 변환하여 return
    return list(numbers)
solution([1,2,3],'right') 
# 결과 : [3, 1, 2]

deque(덱)

  1. deque 정의
    • 우선 덱을 정의하자면 “앞으로, 뒤로 어느 방향이든 넣고 뺄 수 있는 자료 구조(양방향)“라고 할 수 있다.
    • 덱은 스택과 큐의 특성을 모두 갖는, 둘의 자료구조를 조합한 자료구조이다.
  2. deque 메서드
    • rotate(회전 횟수)
    • 회전 횟수에서 음수는 왼쪽으로, 양수는 오른쪽으로 회전한다.
      • rotate(1) : 오른쪽으로 1칸 회전, rotate(-1) : 왼쪽으로 1칸 회전
        • pop()
    • 파라미터에 인덱스를 넣으면 해당 번지에 요소가 제거된다.
    • 파라미터가 없을 경우 제일 끝 요소가 제거된다. - popleft()
    • 파라미터가 없을 경우 pop은 끝 요소가 제거되지만 popleft()는 제일 앞 요소가 제거된다.

회고

  • 인덱싱, 슬라이싱에서 -1번지를 활용하기.
  • deque 라이브러리도 사용해보기.

참조 사이트

deque 정리!
배열 회전시키기 풀이!