https://www.acmicpc.net/problem/14717
14717번: 앉았다
영학이의 패를 뜻하는 두 개의 정수 A, B가 주어진다. (1 ≤ A, B ≤ 10)
www.acmicpc.net
풀이
영학이의 패가 2장 주어졌을 때 남은 카드는 총 18장이다. 그럼 상대방이 패를 받을 수 있는 경우의 수는 총 18C2 이다.
만약 영학이가 가지고 있는 두 장의 패가 같다면 상대방의 패도 같아야 하기 때문에 경우의 수는 153 - 10 + a 이다. 확률은 -> (float)(153 - 10 + a) / 153 으로 구했다.
만약 영학이가 가지고 있는 두 장의 패가 다르다고 해보자. 이 경우에서 조금 많이 헤맸다. 확률이 예제 출력보다 작게 나왔다. 그럼 경우의 수가 cnt가 정답보다 적게 세졌다는 소린데... 처음 구현을 했을 때는 아래 처럼 구현을 했다.
int cnt = 0;
for (int i = 1; i <= 10; i++) {
for (int j = 1; j <= 10; j++) {
if (i == j) continue;
if ((a + b) % 10 > (i + j) % 10) {
cnt++;
}
}
}
그냥 상대방이 가질 수 있는 모든 패를 탐색하면서 영학이가 이길 수 있는 조건(영학의 일의 자리 > 상대방의 일의 자리) 일때 cnt++을 해주었다.
하지만 문제 전체 경우의 수를 18C2로 했기 때문에 영학이가 뽑은 패와 완전히 겹치는 경우에는 cnt += 1, 하나만 겹치는 경우에는 cnt += 2, 두장 다 겹치지 않는 경우에는 cnt += 4 를 해주어야 한다. 이 점을 바꾸어 제출하여 AC를 받았다.
AC 코드
#include <iostream>
#include <vector>
#include <algorithm>
#include <functional>
#include <string>
using namespace std;
using ll = long long;
int a, b;
int main() {
ios::sync_with_stdio(0); cin.tie(0), cout.tie(0);
cin >> a >> b;
cout << fixed;
cout.precision(3);
if (a == b) {
float ans = (float)(153 - 10 + a) / 153;
cout << ans << '\n';
}
else {
int cnt = 0;
for (int i = 1; i <= 10; i++) {
for (int j = i+1; j <= 10; j++) {
if (i == j) continue;
if ((a + b) % 10 > (i + j) % 10) {
if (a != i && b != j && a != j && b != i) {
cnt += 4;
}
else {
cnt += 2;
}
}
}
}
cout << (float)cnt / 153 << '\n';
}
}
'PS > 문제풀이' 카테고리의 다른 글
[BOJ] 14923 - 미로 탈출 (C++) (9) | 2021.11.15 |
---|---|
[BOJ] 2045 - 마방진 (C++) (0) | 2021.10.27 |