프로그래밍 공부
BOJ/백준 15921 수찬은 마린보이야!! 본문
https://www.acmicpc.net/problem/15921
15921번: 수찬은 마린보이야!!
기댓값 E(X)의 정의는 ‘각 사건이 벌어졌을 때의 이득과 그 사건이 벌어질 확률을 곱한 것을 전체 사건에 대해 합한 값’이다. 다시 말해, 어떤 수 x가 수열에 등장할 확률 P(x) = (x의 등장 횟수) /
www.acmicpc.net
언어 : C++14
환경 : Visual Studio 2019
이 문제를 푸는 방법은 2가지가 있다
하나는 문제의 힌트를 사용해서 또는 평균값과 기댓값은 일반적으로 같다는 것을 이용하는 방법.
문제의 힌트를 사용해서 일일이 계산을 해주는 방법.
#include <iostream>
using namespace std;
struct Record { // 점수를 저장할 구조체
double score = 0.0; // 점수
double cnt = 0.0; // 점수의 빈도
};
int main() {
int n;
double solve = 0.0, avg = 0.0;;
cin >> n;
Record *arr = new Record[n];
for (int i = 0; i < n; i++) {
bool check = true;
double record; cin >> record;
avg += record;
for (int j = 0; j < n; j++) {
if (arr[j].score == record) { // 같은 점수가 있으면
arr[j].cnt++; check = false; break; // cnt++ 하고 break;
}
}
if (check) { // 같은 점수가 아니면
arr[i].score = record; arr[i].cnt++; 값을 넣어주고 cnt++
}
}
for (int i = 0; i < n; i++) {
solve += arr[i].score * arr[i].cnt / n;
}
if (n == 0 || solve == 0) { // n또는 score의 합이 0이면
cout << "divide by zero";
return 0;
}
avg /= n;
cout << fixed;
cout.precision(2);
cout << (double)avg / solve;
return 0;
}
평균값과 기댓값은 일반적으로 같다는 것을 이용하는 방법.
#include<iostream>
using namespace std;
int main() {
int n, sum = 0;
cin >> n;
for (int i = 0; i < n; i++) {
int a; cin >> a; sum += a;
}
if (n == 0 || sum == 0){
cout << "divide by zero";
return 0;
}
cout << "1.00";
return 0;
}
이 방법은 n 또는 sum이 0이면 "divide by zero"를 출력하고 아니면 "1.00"을 출력해주면 된다
결과


일부러 힌트를줘서 귀찮게 만드는 문제인 거 같았다.
난 아무생각없이 문제 힌트를 이용해서 처음 방법으로 풀다가 일반적으로 평균값 / 기댓값 이면 1인걸 떠올렸다.
사실 위에것도 구조체 만들고 반복문 만들 필요 없이 입력받을 때 solve += arr[i].score * 1 / n; 해서 계산하면 풀린다.
'Problem Solving > Baekjoon Online Judge' 카테고리의 다른 글
| BOJ/백준 7568 덩치 (0) | 2021.07.21 |
|---|---|
| BOJ/백준 13459 숨바꼭질 3 (0) | 2021.07.05 |
| BOJ/백준 1654 랜선 자르기 (0) | 2021.06.29 |
| BOJ/백준 4153 직각삼각형 (0) | 2021.06.29 |
| BOJ/백준 1547번 공 (0) | 2021.06.28 |
Comments