[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

코드

#include <iostream>
#include <math.h>
using namespace std;
main(){
    int n, feel; cin>>n>>feel;
    double g_g, g_b, b_g, b_b; cin>>g_g>>g_b>>b_g>>b_b;
    double preG[n], preB[n];
    
    if(feel == 0){
        preG[0= g_g; preB[0= g_b;
    }
    else{
        preG[0= b_g; preB[0= b_b;
    }
    
    for(int i=1; i<n; i++){
        preG[i] = preG[i-1* g_g + preB[i-1* b_g;
        preB[i] = preG[i-1* g_b + preB[i-1* b_b;
    }
    
    cout << round(preG[n-1]*1000<< '\n'
    << round(preB[n-1]*1000);
}
cs

뚝딱 풀 수 있을 것 같아서 들고 온 문제인데, 꽤나 생각을 많이 해야했다. 경우에 따른 확률을 누적해 나가는 게 핵심. preG(기분 좋은 확률), preB(기분 나쁜 확률)을 각각 누적해서 구한다. 초기값이 1, 0으로 주어지기 때문에 다음 확률은 각각 2가지의 경우로 구해서 더하면 된다.

쉽게 말해서, 좋은 경우만 본다면
1. 전날 좋음 * 계속 좋음
2. 전날 싫음 * 다시 좋음

이 두가지 경우를 더하면 된다. 반올림은 math.h에 포함된 round 함수로 해결했다.

댓글 없음:

Powered by Blogger.