배열 회전시키기

2024. 8. 4. 18:00코딩테스트 입문

https://school.programmers.co.kr/learn/courses/30/lessons/120844

 

프로그래머스

코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.

programmers.co.kr


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


제한사항

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

입출력 예

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

  • 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합니다.

배열을 direction 방향으로 한 칸씩 미루는 문제입니다.

이런 문제들을 보면 numbers 배열을 2개 이어 붙인 다음에

1. left라면 1부터 len(numbers)만큼 슬라이싱한다.

2. right라면 len(numbers) - 1부터 len(numbers)만큼 슬라이싱한다.

이 2가지면 해결되지 않을까 생각이 드네요.

 

이 방법으로 문제를 풀어보도록 하겠습니다.

def solution(numbers, direction):
    if direction == "left":
        return (numbers * 2)[1:1+len(numbers)]
    else:
        return (numbers * 2)[len(numbers) - 1:2 * len(numbers) - 1]

 

파이썬에서는 collections 패키지에서 deque을 제공합니다.

이 deque에는 rotate라는 함수가 있는데, 이게 우리가 푸는 문제처럼 -1은 왼쪽으로 밀어내고, 1은 오른쪽으로 밀어냅니다. 큐 자체는 유지하면서요.

# deque 구조를 가져옵니다.
from collections import deque
def solution(numbers, direction):
    # queue를 생성합니다.
    queue = deque(numbers)
    # 왼쪽으로 밀어냅니다.
    if direction == "left":
        queue.rotate(-1)
    # 오른쪽으로 밀어냅니다.
    else:
        queue.rotate(1)
    return list(queue)

따라서 이렇게 deque 구조를 사용하여 문제를 풀 수도 있습니다.

'코딩테스트 입문' 카테고리의 다른 글

합성수 찾기  (0) 2024.08.06
주사위의 개수  (0) 2024.08.05
공 던지기  (0) 2024.08.03
2차원으로 만들기  (0) 2024.08.02
점의 위치 구하기  (0) 2024.08.01