Stay Hungry Stay Foolish

SWEA

[SWEA] 1225. [S/W 문제해결 기본] 7일차 - 암호생성기 (Python/D3)

dev스카이 2024. 10. 21. 23:13

[문제 링크] 👇

 

SW Expert Academy

SW 프로그래밍 역량 강화에 도움이 되는 다양한 학습 컨텐츠를 확인하세요!

swexpertacademy.com


풀이

💡핵심 : 자료 구조 - 힙 이용

 

파이썬에서의 힙 - deque

deque(덱)는 파이썬의 collections 모듈에서 제공하는 양방향 큐로, 리스트와 유사하지만 양쪽 끝에서 빠른 삽입과 삭제가 가능하다. 리스트와 비교해 시간 복잡도가 더 효율적이기 때문에, 양쪽에서 데이터를 자주 추가하거나 제거하는 경우 deque를 사용하는 것이 좋다.

[deque에 대한 자세한 설명] 👉 https://dev-cloud.tistory.com/322

 

 

1. 큐를 생성하고 입력 받은 8개의 숫자 리스트를 담는다.

data_deque = deque(data)  # 큐 생성

 

 

2. 사이클을 위한 변수에 1을 담아 설정한다.

cycle = 1

 

 

3. popleft() 을 이용해 덱에서 가장 왼쪽 값을 꺼낸 후, 그 값을 감소시킨다.

num = data_deque.popleft() #가장 왼쪽 값을 반환, 오른쪽 끝은 pop()
num -= cycle

 

 

4. 감소시킨 값이 0보다 작아지거나 0일 경우 0으로 저장하고, 암호를 고정한다.

if num <= 0: #0보다 작아지거나 0일 경우 0으로 저장
    num = 0
    data_deque.append(num)
    break
  • 감소시킨 값이 0이거나, 0보다 작아졌을 때 숫자를 0으로 설정한다.
  • 그 값을 덱의 맨 오른쪽 끝에 추가한다.
  • 그리고 반복문을 중단한다.

 

5. 감소시킨 값이 0 이상이면 오른쪽 끝에 append()를 이용해 값을 추가한다. 그리고 cycle 변수를 증가한다.

data_deque.append(num) #오른쪽 끝에 새로운 값을 추가, 왼쪽 끝은 appendleft()
cycle += 1

 

 

6. 사이클을 위한 변수가 5를 초과하면 다시 1로 초기화한다.

if cycle > 5:
    cycle = 1

 

 

Solution

from collections import deque

for tc in range(10):
    tc_num = int(input())
    data = list(map(int, input().split()))
    data_deque = deque(data)  # 큐 생성
    cycle = 1

    while data_deque:
        num = data_deque.popleft() #가장 왼쪽 값을 반환, 오른쪽 끝은 pop()
        num -= cycle
        if num <= 0: #0보다 작아지거나 0일 경우 0으로 저장
            num = 0
            data_deque.append(num)
            break

        data_deque.append(num) #오른쪽 끝에 새로운 값을 추가, 왼쪽 끝은 appendleft()
        cycle += 1
        if cycle > 5:
            cycle = 1

    print("#%d" % tc_num, end=' ')
    for i in data_deque:
        print("%d" %i, end=' ')
    print()

👩‍💻 회고

자료 구조를 이용해 문제를 풀어야 한다는게 느껴졌다. 스택이나, 힙, 덱의 개념을 조금이라도 알고 있다면 쉽게 풀 수 있는 문제였다. 추후에 스택, 힙 모듈에 대해서 따로 정리하고 암기해야겠다.