상세 컨텐츠

본문 제목

백준 14717 : 앉았다

밀라 알고리즘 스터디

by qkrtnals 2025. 1. 9. 22:31

본문

💡기본 정보

유형
: 브루트포스
풀이 날짜
: 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(배열에서 변경을 시작할 인덱스, 배열에서 제거할 요소의 수)

관련글 더보기