[Python] 코딩 도장 - 리스트 회전

Updated:

코딩 도장 사이트의 문제를 직접 풀어본 내용을 정리하여 올립니다.

코딩 도장에서 여러 문제를 확인할 수 있습니다.

난이도 순으로 차근차근 풀어보려 합니다.


[문제: 리스트 회전] - Lv.2

아래 조건에 따라 리스트를 회전하는 프로그램을 작성하시오.

조건

  • 입력값은 한 행의 문자열로 주어지며, 각 값은 공백으로 구분된다.

  • 첫 번째 값은 리스트를 회전하는 양과 방향(음수의 경우 좌측으로, 양수의 경우 우측으로 회전)이다.

  • 첫 번째 값을 제외한 나머지 값은 리스트의 각 항목의 값이다.

  • 회전된 리스트를 문자열로 출력한다.

  • 구현에 이용할 자료구조에 대한 조건이나 제약은 없다.

  • 입력되는 리스트의 항목의 개수는 유한한다.

입출력예

예 1)

입력: 1 10 20 30 40 50

출력: 50 10 20 30 40

예 2)

입력: 4 가 나 다 라 마 바 사

출력: 라 마 바 사 가 나 다

예 3)

입력: -2 A B C D E F G

출력: C D E F G A B

예 4)

입력: 0 똘기 떵이 호치 새초미

출력: 똘기 떵이 호치 새초미

출처: https://codingdojang.com/scode/400?answer_mode=hide


[풀이]

def list_rot():
    lst = input().split()

    # 첫 번째 값 저장 후 제거 (반대부호로 적용하여 index로 사용: minus index)
    str_idx = - int( int(lst[0]) % (len(lst)-1) )
    lst.pop(0)

    # minus index의 plus index를 계산
    end_idx = lst.index(lst[str_idx]) # len(lst) + str_idx

    # 출력
    print(lst[str_idx:] + lst[:end_idx])

for i in range(0,4): list_rot()
1 10 20 30 40 50
['50', '10', '20', '30', '40']
4 가 나 다 라 마 바 사
['라', '마', '바', '사', '가', '나', '다']
8 가 나 다 라 마 바 사
['사', '가', '나', '다', '라', '마', '바']
0 똘기 떵이 호치 새초미
['똘기', '떵이', '호치', '새초미']

입력 첫 번째 값이 양수면 출력은 그 값만큼 뒤에서의 index로, 음수면 그 값에서 1을 더한만큼 앞에서의 index로 시작한다.

예를 들어, 2인 경우 -2부터 시작하고 -2인 경우 3부터 시작한다.

어처피 출력에선 첫 번째 값이 필요 없으므로 지워주어 양수건 음수건 반대부호로 설정하면 시작 index를 찾을 수 있다.

회전 수가 원래 길이를 초과할 수 있으므로 index는 원래 길이로 나누었을 때 나머지로 계산한다.

위 과정이 끝난 후 출력은 슬라이싱으로 완성하였다.


[추천 풀이]

data = input('회전수와 문자열을 입력하세요. : ').split()
rn = int(data.pop(0)) % len(data)
print(' '.join([(data*3)[len(data) + i - rn] for i in range(len(data))]))
회전수와 문자열을 입력하세요. : 8 가 나 다 라 마 바 사
사 가 나 다 라 마 바

이분이 구한 rn이 내가 구한 str_idx와 같은데 리스트에서 pop()으로 index를 넣으면 그 값이 반환된다.

뒤의 len()도 하나의 값이 제거된 길이를 구하므로 내가 작성한 코드보다 간결하다.

이 후 내가 슬라이싱을 사용했다면 이 분은 인덱싱 후 join()을 사용하였다.

(인덱싱을 위해서 리스트를 연장시켜두었다.)

Leave a comment