본문 바로가기

코드포스

[코드포스 Practice18] B. Dreamoon and WiFi

 

이거 더 간단한 방법 있었을 것 같은데 조합밖에 안 떠올라서 조합 써서 풀었다.

 

조합.. 코딩해야 하는데 머리 안 굴러가서 전에 짜둔거 들고왔음ㅎㅎ..

 

지금 보니 짤 수 있을 것 같다

 

 

이 문제ㅋㅋ 계속 틀리는데 이유를 몰랐다. 

 

작은 문자열부터 확인해보다가 ?이 없는 문자열을 계산 안 해줬다는 거 깨닫고 조건 추가해줬다.

 

근데 이 다음부터는 도저히 원인을 몰랐는데 모를만 했다..

 

 

실수 출력 할 때 오차범위를 조심해야 한다.

 

나는 0.5 이렇게 출력하면 그 뒷 범위는 자동으로 계산해주는 줄 알았는데 아니었음.

 

이 때는 cout 말고 printf("%.10lf") 이렇게 소수점 10자리까지 출력하겠다고 명시해놔야 한다.

 

 

 

 

#include <iostream>
#include <algorithm>
#include <vector>
#include <string>
#include <functional>
#include <string>
#include <queue>
#include <stack>
#include <set>
 
using namespace std;
using i64 = long long;
using ii = pair<int, int>;
 
i64 combination(int n, int k)
{
    if(n == k || k == 0)
        return 1;
    return (combination(n-1, k-1) + combination(n-1, k));
}
 
int main() {
    string send;
    string recv;
    cin >> send;
    cin >> recv;
    
    int pos = 0;
    for (int i = 0; i < send.size(); i++)
    {
        if (send[i] == '+')
            pos++;
        else
            pos--;
    }
   
    int r_pos = 0, q_num = 0;
    for (int i = 0; i < recv.size(); i++)
    {
        if (recv[i] == '+')
            r_pos++;
        else if (recv[i] == '-')
            r_pos--;
        else
            q_num++;
    }
    if (q_num == 0)
    {
        if (r_pos == pos)
            cout << "1.0";
        else
            cout << "0.0";
        return (0);
    }
    
    vector<i64> res;
    int start = q_num;
    for (int i = 0; i <= q_num; i++, start -= 2)
    {
        i64 comb = combination(q_num, i);
        for (i64 i = 0; i < comb; i++)
        {
            res.push_back(start);
        }
    }
    
    double d = 0;
    for (int i = 0; i < res.size(); i++)
    {
        res[i] += r_pos;
        if (pos == res[i])
            d++;
    }
    printf("%.10lf", d/(double)res.size());
    
    return 0;
}