[BOJ] 17211 좋은날, 싫은날



문제

지은이가 건국한 나라인 유애나에 살고 있는 재현이는 너무 단순한 나머지 매일이 기분이 좋은 날, 기분이 싫은 날 두가지로 나누어진다. 어느 날 지은이는 재현이에 대한 놀라운 사실을 발견했다! 재현이의 오늘의 기분이 내일의 기분에 영향을 준다는 것이었다. 문득 지은이는 N일 뒤의 재현이의 기분이 어떻게 될지 궁금하였다. 지은이를 위해 N일 뒤 재현이의 기분이 어떨지 알려주는 프로그램을 만들어보자.


입력

첫째 줄에 정수 N(1 ≤ N ≤ 100)과 현재 재현이의 기분(좋은 날 0, 싫은 날 1)이 주어진다.
둘째 줄에 차례대로 재현이가 기분이 좋은 날의 다음 날도 기분이 좋은 날일 확률, 다음 날은 기분이 싫은 날일 확률, 기분이 싫은 날의 다음 날이 기분이 좋은 날일 확률, 다음 날도 기분이 싫은 날일 확률이 주어진다. 확률은 소수점 둘째자리까지 주어진다.


출력

N일 뒤의 재현이의 기분이 좋은 날일 확률과 싫은 날일 확률에 1,000을 곱해 소수점 첫째자리에서 반올림한 수를 차례대로 출력한다. 절대 오차는 100까지 허용한다.


예제 입력 1 

2 1
0.70 0.30 0.50 0.50


예제 출력 1 

600
400

내가 제출한 답 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
#include <iostream>
#include <cmath>
using namespace std;
void days(int n,int now,double *c){
    double good[101],bad[101];
    if(now == 0){
        good[0]=c[0]; bad[0]=c[1];}
    else{
        good[0]=c[2]; bad[0]=c[3];
    }
    for(int i=1;i<n;i++){
        good[i]=good[i-1]*c[0]+bad[i-1]*c[2];
        bad[i]=good[i-1]*c[1]+bad[i-1]*c[3];
    }
    cout<<round(good[n-1]*1000.0)<<'\n'<<round(bad[n-1]*1000.0);
}
int main(){
    int n,now;
    double chance[4];
    cin>>n>>now;
    for(int i=0;i<4;i++)
        cin>>chance[i];
    days(n,now,chance);
}
cs

바로 전날의 누적 확률에 계속해서 확률을 곱해야 하는 문제. 알 것 같은데 모르겠어서 생각보다 오래 생각했다. 소수를 반올림 하는 부분에서 round() 함수를 썼다가 시간초과가 날 까 걱정했는데 다행히 아슬아슬하게 넘겼다. 아무래도 함수를 사용하는 것 보다는 산술계산이
더 빠르지 않을까 싶다.

No comments:

Powered by Blogger.