codility - CyclicRotation

TechN0·2025년 1월 7일

알고말고 알고리즘

목록 보기
10/22

문제

https://app.codility.com/programmers/lessons/2-arrays/cyclic_rotation/

N개의 정수로 구성된 배열 A와 정수 K가 주어짐

A가 [a, b, c, d]일 때 한번 회전을 하면

[b, c, d, a]

이런 식으로 맨 앞의 원소가 맨 뒤로 가는데 이걸 한번 회전했다고 함

A 를 K번 회전한 결과를 출력하는 문제

풀이

  • 일단 앞에서 빼 고 뒤에 넣어야 하니 deque 쓰자
from collections import deque
  • 처음에 풀었을 때는 답은 맞는데 점수가 낮아서 왜 인가 했는데 문제에 N개의 정수로 구성된 배열 A인데 N이 [0…100] 범위 내의 정수라는 조건이 있다. 그러니 A 리스트가 비어있는 경우도 있다는 뜻
  • A가 빈 깡통일 경우에는 연산을 하지 않고 바로 A를 return하는 조건문을 적용해야 한다.

(옘병, 이건 함정 아니냐고 . . . )

if not A:
        return A
  • 그 다음 A를 deque로 만들 q라는 변수를 만들어주자
q = deque(A)
  • A를 K번 회전 시키는데 여기서 K번 그대로 회전 시키면 효율성이 떨어져 점수가 낮게 나온다(왜 아냐구요? 저도 알고 싶지 않았어요…)
  • K가 N(A의 길이)보다 커버리면 회전이 한 바퀴 돌아 처음 상태로 돌아오는 경우가 생기는데 ex) [a, b, c, d] 를 4번 회전 시키면 그대로인 [a, b, c, d] K 를 N으로 나누고 나오는 나머지 만큼만 회전 시켜줘도 k번 회전 시키는 경우와 결과가 같다.
K = K % len(A)
  • 그 다음 나머지로 재 할당한 K 만큼 반복을 돌 건데
  • q를 pop 하고 다시 appendleft 해준다
for i in range(K):
        temp = q.pop()
        q.appendleft(temp)
  • 마지막에 dequ를 list로 변환해서 리턴 해주면 끝

코드

from collections import deque
def solution(A, K):
    if not A:
        return A
    q = deque(A)
    K = K % len(A)
    for i in range(K):
        temp = q.pop()
        q.appendleft(temp)
    return list(q)

0개의 댓글