[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] |
처음 생각
- 임시변수(temp)를 활용하여 각각의 번지에 있는 값을 바꾸려 했음. -> 이 방법으로 처리하려다 보니 너무 복잡하게 처리되어서 해결하지 못했음.
참고한 풀이
- numbers라는 파라미터에 인덱싱과 슬라이싱을 이용하여 접근한 뒤 새로운 배열에 append 하는 방법
- 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(덱)
- deque 정의
- 우선 덱을 정의하자면 “앞으로, 뒤로 어느 방향이든 넣고 뺄 수 있는 자료 구조(양방향)“라고 할 수 있다.
- 덱은 스택과 큐의 특성을 모두 갖는, 둘의 자료구조를 조합한 자료구조이다.
- deque 메서드
rotate(회전 횟수)
- 회전 횟수에서 음수는 왼쪽으로, 양수는 오른쪽으로 회전한다.
- rotate(1) : 오른쪽으로 1칸 회전, rotate(-1) : 왼쪽으로 1칸 회전
pop()
- rotate(1) : 오른쪽으로 1칸 회전, rotate(-1) : 왼쪽으로 1칸 회전
- 파라미터에 인덱스를 넣으면 해당 번지에 요소가 제거된다.
- 파라미터가 없을 경우 제일 끝 요소가 제거된다.
-
popleft()
- 파라미터가 없을 경우
pop
은 끝 요소가 제거되지만popleft()
는 제일 앞 요소가 제거된다.
회고
- 인덱싱, 슬라이싱에서 -1번지를 활용하기.
- deque 라이브러리도 사용해보기.