728x90

https://swexpertacademy.com/main/code/problem/problemDetail.do?contestProbId=AV5LsaaqDzYDFAXc

 

SW Expert Academy

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

swexpertacademy.com

 

# 접근 방법

  • 우선 제일 처음 빵이 만들어지기 전에 손님이 방문한다면 "Impossible" 출력과 동시에 끝내주었다.
  • 또한 빵을 받아가는 사람 수가 처음 만든 빵의 개수보다 적다면 위의 조건 이후에 elif 조건문을 이용하여 "Possible" 출력을 해주며 끝내주었다.
  • 이제 나머지 조건에 맞추어서 답을 내주면 되는데, 방문하는 사람을 "시간 초"로 표현하였기에 "시간"에 관점을 두고 풀이를 하였다.
  • 빵을 만드는데 걸리는 시간을 누적해주며 빵의 개수만큼 "Queue" 구조를 이용하여 삭제시켜주었다.
  • 만약, 빵을 받아가는 사람의 시간 초가 현재 누적시간보다 작다면 ! 받아갈 수 없다는 것을 이용하였다.
    • ex) 60초 동안 10개의 빵을 만든다면 시간은 60*1, 60*2 ....  
    • 방문하는 사람의 시간초가 60, 60, 61, 61, 61, 70, 100, 101, 119, 119, 119라면 첫 사이클에 빵을 나눠주고 다음 빵을 받는 사람은 119초에 오는 손님이 된다.
    • 하지만 60*2초에 다음 빵이 만들어 지므로 기다리게 된다
# 예약제
# N명, 0초 시작, M초에 K개
import sys
from collections import deque
sys.stdin = open('input.txt')




T = int(input())
for tc in range(1, T+1):
    N, M, K = map(int, input().split())
    arrive = list(map(int, input().split()))

    # 기다리는 시간없이 붕어빵 제공가능 하면 possible, 아니라면 impossible
    result = 0
    # 시간 카운트
    second = 1
    # 붕어빵 주면서 q에서 빼준다.
    arrive.sort()


    # 첫사람이 기다리면 바로 종료
    if arrive[0] < M:
        print(f'#{tc} Impossible')

    # 처음만들었을 때 전부 받아갈 수 있다면 종료
    elif len(arrive) < K:
        print(f'#{tc} Possible')

    # 둘 다 아니라면 카운트 세주면서 본다.
    else:
        # 빵만드는 개수보다 작게 남았다면 종료해도된다.
        while len(arrive) >= K and result == 0:
            # 사람 수만큼 반복
            for i in range(K):
                # 현재 생산 사이클보다 사람이 일찍 방문한다면
                # 현재까지 총 생산가능한 빵개수를 시간으로 표현!
                if M * second > arrive[0]:
                    result = 1
                    print(f'#{tc} Impossible')
                    break
                arrive.pop(0)
            second +=1
        else:
            if result == 0:
                print(f'#{tc} Possible')
728x90