Computer >> 컴퓨터 >  >> 프로그래밍 >> C++

C++로 N+1일째 비가 올 확률 계산하는 방법

문제 소개

0과 1로만 이루어진 배열이 하나 주어집니다. 이때 0은 비가 오지 않은 날, 1은 비가 온 날을 나타냅니다. 우리가 해야 할 일은 이 강수 기록을 바탕으로 N+1일째에 비가 올 확률을 계산하는 것입니다.

N+1일째 비가 올 확률은 아래 공식으로 간단하게 구할 수 있습니다.

비가 올 확률 = 배열 속 비가 온 날(1)의 총 개수 ÷ 전체 일수

즉, 지금까지의 기록에서 비가 온 날이 차지하는 비율을 그대로 다음 날의 강수 확률로 보는 빈도 기반(frequency-based) 접근 방식입니다.

예제 1

입력

arr[] = {1, 0, 0, 0, 1}

출력

N+1일째 비가 올 확률 : 0.4

풀이

전체 일수(비 온 날 + 비 안 온 날): 5일
비가 온 날(1로 표시된 날)의 수: 2일
N+1일째 비가 올 확률: 2 / 5 = 0.4

예제 2

입력

arr[] = {0, 0, 1, 0}

출력

N+1일째 비가 올 확률 : 0.25

풀이

전체 일수(비 온 날 + 비 안 온 날): 4일
비가 온 날(1로 표시된 날)의 수: 1일
N+1일째 비가 올 확률: 1 / 4 = 0.25

프로그램의 접근 방식

  • 배열의 요소를 입력받습니다.
  • 비가 온 날은 1로 표시합니다.
  • 비가 오지 않은 날은 0으로 표시합니다.
  • 위에서 소개한 공식을 적용해 확률을 계산합니다.
  • 계산 결과를 출력합니다.

알고리즘

시작
Step 1 → N+1일째 비가 올 확률을 구하는 함수 선언
    float probab_rain(int arr[], int size)
        float형 변수 count = 0, a 선언
        반복문 For (int i = 0; i < size; i++)
            IF (arr[i] == 1)
                count 증가
            End
        End
        a = count / size 대입
        return a
Step 2 → main() 함수에서
        int arr[] = {1, 0, 0, 0, 1} 선언
        int size = sizeof(arr) / sizeof(arr[0]) 선언
        probab_rain(arr, size) 호출
종료

C++ 구현 예제

#include <bits/stdc++.h>
using namespace std;
// N+1일째 비가 올 확률을 계산하는 함수
float probab_rain(int arr[], int size){
    float count = 0, a;
    for (int i = 0; i < size; i++){
        if (arr[i] == 1)
            count++;
    }
    a = count / size;
    return a;
}
int main(){
    int arr[] = {1, 0, 0, 0, 1};
    int size = sizeof(arr) / sizeof(arr[0]);
    cout << "N+1일째 비가 올 확률 : " << probab_rain(arr, size);
    return 0;
}

실행 결과

위 코드를 컴파일하여 실행하면 다음과 같은 출력을 얻을 수 있습니다.

N+1일째 비가 올 확률 : 0.4

정리 및 추가 설명

이 문제의 핵심은 배열을 한 번만 순회하면서 1의 개수를 세는 것입니다. 시간 복잡도는 O(n), 공간 복잡도는 O(1)로 매우 효율적입니다.

구현 시 한 가지 주의할 점은 자료형입니다. countfloat으로 선언했기 때문에 count / size 연산이 정수 나눗셈이 아닌 실수 나눗셈으로 처리되어 소수점 확률 값을 정확히 얻을 수 있습니다. 만약 countint라면 2/5의 결과가 0이 되어버리므로 형 변환에 유의해야 합니다.

다만 이 방법은 모든 날의 강수 여부가 서로 독립적이라고 가정하고, 과거 데이터의 단순 비율을 미래 확률로 사용한다는 한계가 있습니다. 실제 날씨는 계절성, 기압 패턴 등 다양한 요인의 영향을 받기 때문에 실전 예측에는 더 정교한 통계 모델이나 머신러닝 기법이 필요합니다. 그럼에도 이 예제는 확률의 기본 개념, 배열 순회, 그리고 C++에서의 자료형 선택을 익히기에 좋은 연습 문제입니다.