포트폴리오 재조정

면접 대비

시간 제한1초메모리 제한128 MB

요약
각 기간마다 고정 수수료, 비율 수수료, 수익률을 종목별로 적용하고 NREBALANCE 기간마다 잔액을 모아 원금 비율로 재분배한 뒤, 최종 잔액을 소수 둘째 자리까지 출력한다.
난이도

보통10점 중 4점

유형
시뮬레이션, 구현, 수학, 배열
정답자
아직 제출이 없습니다

문제

한 투자자가 자산을 NINSTRUMENTS개의 금융 상품에 나누어 투자한다. 한 상품의 한 기간(term)을 생각하고, 그 기간이 시작될 때 이 상품이 보유한 금액을 PP라 하자. 상품이 아직 열려 있다면 PP에 대해 다음 세 가지가 순서대로 적용된다.

  1. 고정 관리 비용 FIXED_FEE를 뺀다.
  2. 비율 수수료를 뺀다. 이는 PERCENTAGE_FEE에 PP(기간 시작 시점의 금액)를 곱한 값이다.
  3. 수익을 더한다. 이는 RETURN에 PP를 곱한 값이며, RETURN은 양수일 수도 음수일 수도 있다.

고정 비용을 ff, 비율 수수료를 cc, 수익률을 rr라 하면 기간이 끝난 뒤 상품의 값은 P−f−cP+rPP - f - cP + rP 이다.

어떤 계좌의 값이 한 기간이 끝난 뒤 0 이하가 되면 그 계좌는 닫힌 것으로 간주한다. 닫힌 계좌는 재조정으로 다시 열릴 때까지 정확히 0으로 취급되며 어떤 수수료도 부과되지 않는다.

재조정(rebalancing)은 NREBALANCE 기간마다 한 번씩 일어난다. 이때 모든 상품의 잔액을 하나의 총액으로 합친 뒤, 각 상품의 원래 시작 원금 PRINCIPAL_START의 비율에 따라 다시 나눈다. 재조정을 하지 않으면 수익률이 높은 상품이 점점 포트폴리오를 지배하게 되어, 균형 잡힌 계획보다 더 큰 위험에 노출된다. 모든 상품이 동시에 0이 되는 것도 가능하며, 이 경우 총액이 0이므로 재조정을 해도 모두 0으로 남고 남은 기간 동안 모든 계좌가 닫힌 채로 유지된다.

NTERMS 기간이 모두 끝난 뒤 각 상품의 최종 값을 구하라. 만약 마지막 기간 NTERMS에서 재조정이 일어날 차례라면, 그 마지막 재조정을 하기 전의 값을 출력한다. 모든 계산은 배정밀도(double)로 하고 중간 값을 반올림하지 말며, 최종 답만 센트(소수 둘째 자리)로 반올림한다.

입력

첫 줄에는 세 양의 정수가 주어진다.

NINSTRUMENTS NTERMS NREBALANCE

상품 수는 최대 10, 기간 수는 최대 20이다(1≤NINSTRUMENTS≤101 \le \text{NINSTRUMENTS} \le 10, 1≤NTERMS≤201 \le \text{NTERMS} \le 20, NREBALANCE≥1\text{NREBALANCE} \ge 1). 이어서 공백으로 구분된 실수들이 다음 형식으로 3줄 주어진다.

FIXED_FEE(1) .. FIXED_FEE(NINSTRUMENTS)
PERCENTAGE_FEE(1) .. PERCENTAGE_FEE(NINSTRUMENTS)
PRINCIPAL_START(1) .. PRINCIPAL_START(NINSTRUMENTS)

마지막으로 NTERMS개의 줄이 주어지며, 각 줄에는 그 기간에서 각 상품의 수익률을 나타내는 NINSTRUMENTS개의 실수가 있다.

RETURN(1,1) .. RETURN(1,NINSTRUMENTS)
...
RETURN(NTERMS,1) .. RETURN(NTERMS,NINSTRUMENTS)

모든 비율(PERCENTAGE_FEE와 RETURN)은 비(ratio)로 주어지며 소수점 이하 최대 4자리이다. 예를 들어 수수료 0.0002는 매 기간 해당 상품 투자액의 0.02%가 수수료로 빠진다는 뜻이다. FIXED_FEE와 PRINCIPAL_START는 음이 아닌 실수이며 소수점 이하 2자리로 주어진다. PRINCIPAL_START 값 중 적어도 하나는 양수이다.

출력

NTERMS 기간이 끝난 뒤 각 상품의 최종 원금을 한 줄에 공백 하나로 구분하여 출력한다. 각 값은 센트(소수 둘째 자리)로 반올림하며 항상 소수점 이하 두 자리로 표기한다(닫힌 계좌는 0.00으로 출력된다).

PRINCIPAL_END(1) .. PRINCIPAL_END(NINSTRUMENTS)

예제2

  1. 예제 1

    입력
    4 10 5
    5.00 10.00 20.00 50.00
    0.002 0.001 0.0008 0.0005
    150000.00 100000.00 75000.00 50000.00
    0.10 0.05 -0.05 -0.85
    0.10 0.05 -0.10 -0.85
    0.10 0.05 -0.20 -0.85
    0.10 0.05 -0.40 -0.85
    0.10 0.05 -0.80 -0.85
    0.10 0.05 -0.05 -0.90
    0.10 0.05 -0.05 -0.90
    0.10 0.05 -0.05 -0.90
    0.10 0.05 -0.05 -0.85
    0.10 0.05 -0.05 -0.85
    
    예상 출력
    237698.69 126086.01 57298.74 0.00
    
  2. 예제 2

    입력
    2 3 2
    0.00 0.00
    0.0000 0.0000
    100.00 300.00
    1.0000 -1.0000
    1.0000 -1.0000
    1.0000 1.0000
    
    예상 출력
    200.00 600.00