문제 링크
문제 요약
회사에서 로봇들이 책을 사고팔며 가격을 갱신합니다. 로봇의 가격 갱신 규칙은 다음과 같습니다.
- 첫 번째 로봇(인덱스 0)은 0일에 초기 가격 를 설정합니다.
- 각 로봇은 특정 시작일 부터 일 간격으로 가격을 갱신합니다.
- 가격 갱신 시, 직전 날짜 기준 현재 포털에 올라온 모든 책 가격의 평균을 계산하고, 여기에 자신의 마진율 를 적용하여 새 가격을 결정합니다: .
- 계산된 가격은 한 센트(소수점 둘째 자리) 단위로 표시되며, 0.5센트부터는 올림(반올림) 처리합니다.
- 주어진 로봇의 수 , 첫 번째 로봇의 초기 가격 , 그리고 궁금한 날짜 가 주어질 때, 일 아침에 각 로봇이 제시하는 책 가격을 출력하는 문제입니다.
- (즉, 일까지의 갱신을 반영한 가격입니다.)
풀이
이 문제는 주어진 로봇들의 가격 갱신 규칙을 일까지의 Simulation 문제입니다. 각 날짜마다 모든 로봇의 상태를 확인하고 필요한 경우 가격을 갱신해야 합니다.
prices
:N
개의 로봇 각각의 현재 가격을 저장합니다.cnt
: 현재 포털에 가격을 제시하고 있는(즉, 가격이 0이 아닌) 로봇의 수를 저장합니다.
-
일별 시뮬레이션:
- 날짜
i
를 1부터T-1
까지 반복하며 시뮬레이션을 진행합니다. 일 아침 가격은 일까지의 모든 갱신이 완료된 상태를 의미하기 때문입니다. - 각 날짜
i
의 시작에서는, 이전 날짜(즉,i-1
일의 끝)를 기준으로 모든 로봇의 가격이 고정되어 있습니다. 이 가격들을 사용하여현재 활성화된 로봇들의 가격 평균
을 계산합니다.avg = sum(prices) / cnt
- 날짜
-
로봇별 가격 갱신:
- 현재 날짜
i
에 대해 모든N
개의 로봇을 순회합니다. - 각 로봇의 파라미터(: 시작일, : 갱신 간격, : 마진율)를 가져옵니다.
- 해당 로봇이
i
일에 가격을 갱신할 조건은 두 가지입니다:- 현재 날짜
i
가 로봇의 시작일start_date
보다 크거나 같아야 합니다:i >= start_date
- 시작일로부터 경과한 일수가 갱신 간격
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()