[SWEA-d3]1225. 암호생성기 - python

iamjinseo·2022년 11월 4일
0

문제풀이-Python

목록 보기
130/134
post-thumbnail
post-custom-banner

https://swexpertacademy.com/main/code/problem/problemDetail.do?problemLevel=3&contestProbId=AV14uWl6AF0CFAYD&categoryId=AV14uWl6AF0CFAYD&categoryType=CODE&problemTitle=&orderBy=INQUERY_COUNT&selectCodeLang=PYTHON&select-1=3&pageSize=10&pageIndex=1#;return%20false;

문제 설명

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

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

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

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

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

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

[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로 구현한 코드보다 빠르다.

profile
일단 뭐라도 해보는 중
post-custom-banner

0개의 댓글