다음 주어진 조건에 따라 n개의 수를 처리하면 8자리의 암호를 생성할 수 있다.
8개의 숫자를 입력 받는다.
첫 번째 숫자를 1 감소한 뒤, 맨 뒤로 보낸다.
다음 첫 번째 수는 2 감소한 뒤 맨 뒤로, 그 다음 첫 번째 수는 3을 감소하고 맨 뒤로, 그 다음 수는 4, 그 다음 수는 5를 감소한다.
이와 같은 작업을 한 사이클이라 한다.
[1 사이클]
[암호 도출]
[제약 사항]
주어지는 각 수는 integer 범위를 넘지 않는다.
마지막 암호 배열은 모두 한 자리 수로 구성되어 있다.
[입력]
각 테스트 케이스의 첫 줄에는 테스트 케이스의 번호가 주어지고, 그 다음 줄에는 8개의 데이터가 주어진다.
[출력]
#부호와 함께 테스트케이스의 번호를 출력하고, 공백 문자 후 테스트 케이스의 답을 출력한다.
'''
while 맨끝자리가 0이하일때까지
for i: 1~5
deque <- deque pop
'''
from collections import deque
for i in range(1, 11):
_ = input()
code = deque(list(map(int, input().split())))
while code[-1]>0:
for j in range(1,6):
code.append(code.popleft()-j)
if code[-1]<=0: #암호생성 완료
code[-1]=0; break
print(f"#{i}", *code)
맨 위 주석 참고하고 문제에서 하라는 대로 구현하면 된다.
나는 앞의 값을 빼어 뒤에 넣기 위해 deque
를 이용했다.
for _ in range(10):
test = int(input())
arr = list(map(int, input().split()))
idx = -1
cnt = 0
while arr[idx] > 0: #인덱스를 계속 증가시키며 암호완성시 break
idx += 1
idx %= 8 #index : 0~7
arr[idx] -= cnt % 5 + 1 #cnt%5: 0~4, => cnt%5+1: 1~5
cnt += 1
arr[idx] = 0 #암호도출 후 음수가 된 부분은 0처리
answer = arr[idx+1:] + arr[:idx+1] #0이후부터의 배열과 이전의 배열을 순서 바꿔 합체
print(f'#{test}', *answer)
참고 - https://devlibrary00108.tistory.com/331
앞의 값을 빼고 뒤에 넣겠다는 말에 신경쓰지 않고 %
연산을 적절히 사용하여 문제를 해결했다.
생각없이 냅다 deque
쓰는 것 보다 클린하다.
deque
로 구현한 코드보다 빠르다.