[SWEA][D3][#01225] 암호생성기

작성:    

업데이트:

카테고리:

태그: , ,

출처

학습용 포스트입니다. 본 포스트가 문제가 될 시 수정 또는 삭제하겠습니다.


문제

다음 주어진 조건에 따라 n개의 수를 처리하면 8자리의 암호를 생성할 수 있다.

  • 8개의 숫자를 입력 받는다.

  • 첫 번째 숫자를 1 감소한 뒤, 맨 뒤로 보낸다.

다음 첫 번째 수는 2 감소한 뒤 맨 뒤로, 그 다음 첫 번째 수는 3을 감소하고 맨 뒤로, 그 다음 수는 4, 그 다음 수는 5를 감소한다.

이와 같은 작업을 한 사이클이라 한다.

  • 숫자가 감소할 때 0보다 작아지는 경우 0으로 유지되며, 프로그램은 종료된다. 이 때의 8자리의 숫자 값이 암호가 된다.

그림 생략


제약 사항

주어지는 각 수는 integer 범위를 넘지 않는다.

마지막 암호 배열은 모두 한 자리 수로 구성되어 있다.


입력

각 테스트 케이스의 첫 줄에는 테스트 케이스의 번호가 주어지고, 그 다음 줄에는 8개의 데이터가 주어진다.


출력

#부호와 함께 테스트케이스의 번호를 출력하고, 공백 문자 후 테스트 케이스의 답을 출력한다.


예제

입력

1
9550 9556 9550 9553 9558 9551 9551 9551
2
2419 2418 2423 2415 2422 2419 2420 2415
........


출력

#1 6 2 2 9 4 1 3 0
#2 9 7 9 5 4 3 8 0
.......


My Sol

def cQueue(nums):
    flag = -1

    while True:
        for i in range(1, 6):
            flag = (flag+1)%8
            nums[flag] -= i
            if nums[flag] <= 0:
                nums[flag] = 0
                return flag, nums

for _ in range(10):
    tc = int(input())
    nums = list(map(int, input().split()))
    r, nums = cQueue(nums)
    ans = [nums[i] for i in range(r+1, 8)]
    ans.extend([nums[i] for i in range(r+1)])

    print(f'#{tc}',*ans)

원형 큐의 원리에서 착안해서 풀은 문제였다. 하지만 꽤나 많이 변형하였다. 우선 0번 인덱스부터 빼기 조작을 해주기 위해 first를 의미하는 flag를 -1로 초기화해준다. 이후 8개의 숫자를 가진 리스트에 대하여 1부터 5까지 반복되는 i를 nums[flag]에 빼주면 되겠다. flag는 원형 큐에서처럼 전체 개수인 8로 나눈 나머지로 계산하는데, 최초 -1에서 0번 인덱스의 값에 1을 빼주기 위해 빼기 코드 이전에 flag를 1 늘려주는 코드를 배치하였다. 만약 지금 i만큼 빼준 nums[flag]의 값이 0보다 작거나 같다면, nums[flag]는 0으로 하고, 이때의 flag와 nums를 반환한다.

이를 nums의 입장에서 보면 사실상 앞에서 i만큼 빼고 뒤로 재배치하는 것이 아니라 flag 변수만 0부터 7까지 왔다갔다하면서 1부터 5까지의 빼기 작업을 계속 진행하다가 어느 flag에서 i를 뺐는데 0보다 작아진 상황이 되는 것이다. 때문에 0은 맨 뒤에 와야하므로 flag 이후인 flag+1의 인덱스부터 8까지의 수 각각에 대해 nums의 인덱스로 하여 결과 배열 ans를 정의하였다. 이후 0부터 flag까지의 각 수를 인덱스로 하는 nums[i]를 list comprehension으로 정의한 뒤 extend해주면 0이 맨 뒤로 오고 종료되는 nums의 재배치 배열 ans를 만들 수 있다. 이를 출력 형식에 맞게 unpacking하여 출력하면 되겠다.


결과

PASS

댓글남기기