💡기본 정보
유형
: 브루트포스
풀이 날짜
: 2025년 01월 09일
풀이방법 한줄 요약
: 영학이의 족보를 구하고 상대방이 가질 수 있는 모든 경우의 수의 족보와 비교하기
💡문제에서 구해야 할 것
1,2,3,4,...,9,10 이 쓰인 카드가 각 2장씩 주어져 총 20장의 카드가 사용됨 . 참가자는 2명 .
앉았다의 경기 방법
1. 두 명의 참가자는 순서대로 20장의 카드 중 무작위로 2장의 카드를 가져옴
2. 상대방이 이미 가지고 간 카드를 중복해서 가져올 수 없음 .
그리고 자신은 어떤 카드를 가져왔는지 알 수 있지만 상대방이 어떤 카드를 가져갔는지는 알 수 없음
3. 서로의 패 공개
4. 강한 족보의 패를 가진 사람이 이김 만약 두 참가자가 같은 족보의 패를 가졌다면 비김
족보
: 위에 있는 족보 일수록 더 강한 족보
- 10땡 : 두 패가 모두 10
- 9땡 : 두 패가 모두 9
...
- 2땡 : 두 패가 모두 2
- 1땡 : 두 패가 모두 1
- 9끗 : 땡이 아니고 , 두 패를 더했을 때 일의 자리 수가 9
- 8끗 : 땡이 아니고 , 두 패를 더했을 때 일의 자리 수가 8
...
- 1끗 : 땡이 아니고 , 두 패를 더했을 때 일의 자리 수가 1
- 0끗 : 땡이 아니고, 두 패를 더했을 때 일의 자리 수가 0
영학이는 앉았다 게임에서 자신이 이길 확률이 높을 때만 돈을 베팅함. 영학이가 이길 수 있는 확률 구하기
- 입력 : 영학이의 패를 뜻하는 두 개의 정수 A,B가 주어짐
출력 : 영학이가 이길 확률을 소수점 이하 셋 째자리까지 반올림해서 출력(ex. 0.7인 경우 0.700으로 구해야 함)
💡알고리즘 설계
- 족보를 정할 수 있는 함수
- 영학이의 족보를 정하고 상대가 할 수 있는 모든 경우의 수의 족보와 비교함
- 족보의 인덱스 (순서)를 비교해서 영학이의 족보 인덱스가 더 앞에 있으면 winCount를 증가시킴
- winCount를 전체 경우의 수(카드 개수 *(카드 개수 -1) / 2)로 나눠서 최종 승리 확률 계산
💡CODE
const fs = require("fs");
const mine = fs.readFileSync(0, "utf8").toString().split(" ").map(Number);
function getRank(card1, card2) {
if (card1 === card2) return `${card1}땡`;
const sum = (card1 + card2) % 10;
return `${sum}끗`;
}
function compareRank(myRank, opponentRank) {
const ranks = [
"10땡",
"9땡",
"8땡",
"7땡",
"6땡",
"5땡",
"4땡",
"3땡",
"2땡",
"1땡",
"9끗",
"8끗",
"7끗",
"6끗",
"5끗",
"4끗",
"3끗",
"2끗",
"1끗",
"0끗",
];
const myIndex = ranks.indexOf(myRank);
const opponentIndex = ranks.indexOf(opponentRank);
return myIndex < opponentIndex;
}
function win() {
let card = [1, 1, 2, 2, 3, 3, 4, 4, 5, 5, 6, 6, 7, 7, 8, 8, 9, 9, 10, 10];
const first = mine[0];
const second = mine[1];
card.splice(card.indexOf(first), 1);
card.splice(card.indexOf(second), 1);
const myRank = getRank(first, second);
let winCount = 0;
for (let i = 0; i < card.length; i++) {
for (let j = i + 1; j < card.length; j++) {
const opponentRank = getRank(card[i], card[j]);
if (compareRank(myRank, opponentRank)) {
winCount++;
}
}
}
const totalCase = (card.length * (card.length - 1)) / 2;
const winProbability = winCount / totalCase;
return winProbability.toFixed(3);
}
console.log(win());
💡시간복잡도
💡 틀린 이유 & 틀린 부분 수정
-
💡 다른 풀이 or 기억할정보
const myIndex = ranks.indexOf(myRank);
indexOf() : 인덱스의 위치를 표현하는 함수
card.splice(card.indexOf(second), 1);
array.splice(배열에서 변경을 시작할 인덱스, 배열에서 제거할 요소의 수)
백준 1051 : 숫자 정사각형 (0) | 2025.01.11 |
---|---|
백준 1018 : 체스판 다시 칠하기 (0) | 2025.01.10 |
백준 10488 : 유레카 이론 (1) | 2025.01.08 |
백준 2309 : 일곱 난쟁이 (0) | 2025.01.07 |
개념 정리 : 스택, 큐, 리스트, 해시맵 개념과 사용코드(삽입, 삭제 등) 정리 (0) | 2025.01.06 |