문제 링크

문제 요약

회사에서 로봇들이 책을 사고팔며 가격을 갱신합니다. 로봇의 가격 갱신 규칙은 다음과 같습니다.

  1. 첫 번째 로봇(인덱스 0)은 0일에 초기 가격 를 설정합니다.
  2. 각 로봇은 특정 시작일 부터 일 간격으로 가격을 갱신합니다.
  3. 가격 갱신 시, 직전 날짜 기준 현재 포털에 올라온 모든 책 가격의 평균을 계산하고, 여기에 자신의 마진율 를 적용하여 새 가격을 결정합니다: .
  4. 계산된 가격은 한 센트(소수점 둘째 자리) 단위로 표시되며, 0.5센트부터는 올림(반올림) 처리합니다.
  5. 주어진 로봇의 수 , 첫 번째 로봇의 초기 가격 , 그리고 궁금한 날짜 가 주어질 때, 일 아침에 각 로봇이 제시하는 책 가격을 출력하는 문제입니다.
    • (즉, 일까지의 갱신을 반영한 가격입니다.)

풀이

이 문제는 주어진 로봇들의 가격 갱신 규칙을 일까지의 Simulation 문제입니다. 각 날짜마다 모든 로봇의 상태를 확인하고 필요한 경우 가격을 갱신해야 합니다.

  • prices: N개의 로봇 각각의 현재 가격을 저장합니다.
  • cnt: 현재 포털에 가격을 제시하고 있는(즉, 가격이 0이 아닌) 로봇의 수를 저장합니다.
  1. 일별 시뮬레이션:

    • 날짜 i를 1부터 T-1까지 반복하며 시뮬레이션을 진행합니다. 일 아침 가격은 일까지의 모든 갱신이 완료된 상태를 의미하기 때문입니다.
    • 각 날짜 i의 시작에서는, 이전 날짜(즉, i-1일의 끝)를 기준으로 모든 로봇의 가격이 고정되어 있습니다. 이 가격들을 사용하여 현재 활성화된 로봇들의 가격 평균을 계산합니다. avg = sum(prices) / cnt
  2. 로봇별 가격 갱신:

    • 현재 날짜 i에 대해 모든 N개의 로봇을 순회합니다.
    • 각 로봇의 파라미터(: 시작일, : 갱신 간격, : 마진율)를 가져옵니다.
    • 해당 로봇이 i일에 가격을 갱신할 조건은 두 가지입니다:
      1. 현재 날짜 i가 로봇의 시작일 start_date보다 크거나 같아야 합니다: i >= start_date
      2. 시작일로부터 경과한 일수가 갱신 간격 interval의 배수여야 합니다: (i - start_date) % interval == 0
    • 위 두 조건을 모두 만족하면 가격을 갱신합니다.
      • 갱신 전 prices[idx]가 0이었다면, 이 로봇은 처음으로 가격을 제시하는 것이므로 cnt를 1 증가시킵니다.
      • 새로운 가격은 round(avg * (1 + margin_rate), 2)로 계산합니다.

정답 코드

def solve():
  N, p0, T = input().split()
  N = int(N)
  p0 = float(p0)
  T = int(T)
 
  l = [input().split() for _ in range(N)]
  prices = [0] * (N)
  cnt = 1 # 가격을 제시하고 있는 로봇의 수 (초기 1번 로봇만 가격 제시)
  prices[0] = p0 # 1번 로봇의 초기 가격 설정
 
  # 1일부터 T-1일까지 시뮬레이션 (T일 아침 가격이 목표이므로)
  for i in range(1, T):
    # 이전 날짜(i-1)의 가격들을 기준으로 현재 평균 계산
    avg = sum(prices) / cnt if cnt > 0 else 0
 
    # 각 로봇에 대해 가격 갱신 여부 확인
    for idx in range(N):
      start_date, interval, margin_rate = l[idx]
      start_date = int(start_date)
      interval = int(interval)
      margin_rate = float(margin_rate)
 
      # 현재 날짜(i)가 로봇의 시작일 이후이고, 갱신 간격에 해당하는 날짜인 경우
      if i >= start_date and (i - start_date) % interval == 0:
        # 이 로봇이 이전에 가격을 제시한 적이 없다면 (가격이 0이라면)
        if prices[idx] == 0:
          cnt += 1 # 활성화된 로봇 수 증가
        
        # 새로운 가격 계산 및 반올림 (소수점 둘째 자리까지)
        prices[idx] = round(avg * (1 + margin_rate), 2)
  
  # 최종 가격 출력 (소수점 둘째 자리까지)
  for price in prices:
    print(f"{price:.2f}")
 
 
if __name__ == "__main__":
  tc = 1
  for t in range(1, tc+1):
    ret = solve()
 

연관 페이지

참고 문헌 / 사이트