본문 바로가기

[프로그래머스 Lv.0] 배열 회전시키기

@doyiya242025. 7. 31. 18:37

배열 회전시키기

 

문제 설명

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

 

제한사항

  • 3 ≤ numbers의 길이 ≤ 20
  • direction은 "left" 와 "right" 둘 중 하나입니다.

입출력 예 설명

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

내가 작성한 코드

def solution(numbers, direction):
    if direction == "right":
        element = numbers.pop(-1)
        numbers.insert(0,element)
    elif direction == "left":
        element = numbers.pop(0)
        numbers.append(element)
    return numbers

-> 자료구조와 알고리즘을 적용하지 않은 자의 최후 ..ㅠㅠ

 

 

 

 

다른 사람이 작성한 코드

from collections import deque

def solution(numbers, direction):
    numbers = deque(numbers)
    if direction == 'right':
        numbers.rotate(1)
    else:
        numbers.rotate(-1)
    return list(numbers)

=> 딱 봐도 이게 정석으로 보이네욥 ㅠㅠ! 

 

 

 

 

회고

정석으로 보이지만 내 답이 틀린것만은 아님.

하지만 더 좋은 성능과 최적화된 연산속도를 위해서라면 공부해야함. 주의주의

알고리즘과 자료구조는 틈틈히 기록 및 공부하도록 해야함.

 

 

큐와 데크

  • 큐는 선입선출 방식으로 작동한다.
  • 데크는 양방향 큐이다.

데크 구조

  • 이중연결 리스트 구현
  • 리스트의 pop(0)은 시간복잡도가 O(n) / 데크의 popleft는 O(1) 이기 때문에 성능차이가  큼
  • 스택처럼 사용할 수도 있고, 큐 처럼 사용할 수도 있음
  • 최적화된 연산 속도를 제공함
  • 데크는 특히 push/pop 연산이 빈번한 알고리즘에서 리스트보다 월등한 속도를 보여줌
from collections import deque
deque.append(item): item을 데크의 오른쪽 끝에 삽입한다.
deque.appendleft(item): item을 데크의 왼쪽 끝에 삽입한다.
deque.pop(): 데크의 오른쪽 끝 엘리먼트를 가져오는 동시에 데크에서 삭제한다.
deque.popleft(): 데크의 왼쪽 끝 엘리먼트를 가져오는 동시에 데크에서 삭제한다.
deque.extend(array): 주어진 리스트를 데크의 오른쪽에 추가한다.
deque.extendleft(array): 주어진 리스트를 데크의 왼쪽에 추가한다.
deque.remove(item): item을 데크에서 찾아 삭제한다. (제일 처음 나온 해당 string만 제거됨)
deque.clear(): 해당 deque 전체 삭제
deque.reverse(): 말그대로 역순으로 정렬한다.
deque.rotate(num): 데크를 num만큼 회전한다(양수면 오른쪽, 음수면 왼쪽).

 

 

 

 

 

참고 블로그

https://velog.io/@harper9808/deque%EB%8A%94-%EB%AC%B4%EC%97%87%EC%9D%B8%EA%B0%80

목차