View
문제 설명
정수가 담긴 배열 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
def solution(numbers, direction):
dir = {"right" : 1, "left":-1}
result = [0] * len(numbers)
for i, n in enumerate(numbers):
indx = i + dir[direction]
if dir[direction] == -1:
result[indx] = n
elif dir[direction] == 1:
if indx == len(numbers):
indx = 0
result[indx] = n
return result
나의 풀이 2
numpy의 메소드 roll()는 json 형태로 리턴되므로, tolist()를 사용하여, 형변환을 해주어야 한다.
r인자로, 1. 리스트와 2. 원소를 움직일 방향이 필요하다.
import numpy
def solution(numbers, direction):
a = numpy.array(numbers)
return numpy.roll(a, 1).tolist() if direction == "right" else numpy.roll(a, -1).tolist()
나의 풀이 3
deque의 rotate()메소드는 return값이 없다. 원본 리스트에 영향을 끼친다.
from collections import deque
def solution(numbers, direction):
q = deque(numbers)
if direction == "right":
q.rotate(1)
else:
q.rotate(-1)
return list(q)
다른 풀이 1 - deque()
from collections import deque
def solution(numbers, direction):
queue = deque(numbers)
if direction == 'right':
queue.appendleft(queue.pop())
return list(queue)
queue.append(queue.popleft())
return list(queue)
다른 풀이 2 - slicing
def solution(numbers, direction):
if direction == "right":
answer = [numbers[-1]] + numbers[:len(numbers)-1]
else:
answer = numbers[1:] + [numbers[0]]
return answer
def solution(numbers, direction):
return [numbers[-1]] + numbers[:-1] if direction == 'right' else numbers[1:] + [numbers[0]]
다른 풀이 3 - rotate()
from collections import deque
def solution(numbers, direction):
numbers = deque(numbers)
if direction == 'right':
numbers.rotate(1)
else:
numbers.rotate(-1)
return list(numbers)
알.아.두.고. 가.기.
rotate() : 목록의 회전
단순 슬라이싱을 통해서 리스트를 회전시키는 방법이 있을수 있겠으나,
deque는 양쪽 끝을 당기고 밀도록 최적화되으며, 전용 rotate()메소드가 있어, 목록을 보다 효율적으로 회전 시킬 수 있다.
from collections import deque
items = deque([1, 2])
items.append(3) # deque == [1, 2, 3]
items.rotate(1) # The deque is now: [3, 1, 2]
items.rotate(-1) # Returns deque to original state: [1, 2, 3]
item = items.popleft() # deque == [2, 3]
Numpy의 roll(): 목록의 회전
>>> import numpy
>>> a=numpy.arange(1,10) #Generate some data
>>> numpy.roll(a,1)
array([9, 1, 2, 3, 4, 5, 6, 7, 8])
>>> numpy.roll(a,-1)
array([2, 3, 4, 5, 6, 7, 8, 9, 1])
>>> numpy.roll(a,5)
array([5, 6, 7, 8, 9, 1, 2, 3, 4])
>>> numpy.roll(a,9)
array([1, 2, 3, 4, 5, 6, 7, 8, 9])
'코딩테스트 > 프로그래머스' 카테고리의 다른 글
programmers) 숫자 찾기 (0) | 2022.11.08 |
---|---|
programmers) 외계행성의 나이 (0) | 2022.11.08 |
programmers) 주사위의 개수 (0) | 2022.11.07 |
programmers) 문자열 정렬하기 (2) (0) | 2022.11.07 |
programmers) 가위 바위 보 (0) | 2022.11.07 |
reply