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])

 

Share Link
reply
«   2024/12   »
1 2 3 4 5 6 7
8 9 10 11 12 13 14
15 16 17 18 19 20 21
22 23 24 25 26 27 28
29 30 31