PS/문제풀이

[BOJ] 14717 - 앉았다 (c++)

꼬두람2 2021. 11. 19. 17:23

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