BOJ 14717 앉았다

8369 단어 2021.03.162021.03.16

https://www.acmicpc.net/problem/14717
시간 1초, 메모리 256MB
input :

  • A, B(1 ≤ A, B ≤ 10)

output :

  • 이길 확률을 소수점 이하 셋 째 자리까지 반올림해서 출력

조건 :

  • 두 명의 참가자는 순서대로 20장의 카드 중 무작위로 2장의 카드를 가져온다.
  • 상대방이 이미 가지고 간 카드를 중복해서 가져올 수는 없다. 그리고 자신은 어떤 카드를 가져왔는지 알 수 있지만, 상대방이 어떤 카드를 가져갔는지는 알 수 없다.
  • 서로의 패를 공개한다.
  • 강한 족보의 패를 가진 사람이 이긴다. 만약 두 참가자가 같은 족보의 패를 가졌다면 비긴다.

오랜 시간이였다..... 대학교 1학년때 봤던 문제로. 그때도 막혀서 지금까지 질질 끌고 왔는데 ㅋㅋㅋㅋㅋㅋㅋㅋㅋ 생각보다 별 거 없었다.. 역시 예전의 나

일단 문제에서 입력을 받은 카드들은 우리가 뽑을 수 없다.
그래서 data 배열에서 이 값들을 빼주고, 남은 것들을 temp 배열에 넣어 모든 가능한 경우를 따지려 한다.

data = [2] * 11
data[0] = 0

data[a] -= 1
data[b] -= 1

그냥 18C2 이기 때문에 itertool을 써도 될 것 같다.

그리고 본인이 이기는 경우를 따져야 하기 때문에.
1. 땡 일 경우.

  • 상대가 끗이라면 언제나 승리.
  • 상대의 패 숫자가 본인보다 작으면 승리.
  1. 끗일 경우.
  • 상대가 땡이면 패배.
  • 끗의 경우 두 수를 더해 10이상이 되면 10을 빼서 일의자리 숫자를 쓰자.
  • 그렇게 계산한 후 자신의 숫자가 더 크면 승리한다.

조건을 몇 번 빠뜨린 경우가 많다...

그리고 소수점 3째자리까지 출력이니까.

print("{:.3f}".format(ans / all))

참고
즉 format(3.141592, ".2f"))의 형식으로 소수점 두 자리까지 출력할 수 있습니다.
한편 "{:.1f}".format() 형태로도 사용할 수 있습니다.

import sys

a, b = map(int, sys.stdin.readline().split())

data = [2] * 11
data[0] = 0

data[a] -= 1
data[b] -= 1

temp = []
for idx, item in enumerate(data):
    for i in range(item):
        temp.append(idx)

ans = 0
all = 0
for i in range(len(temp)):
    for j in range(i + 1, len(temp)):
        all += 1
        opposite_1, opposite_2 = temp[i], temp[j]

        if a == b:
            if opposite_1 != opposite_2:
                ans += 1
            else:
                if a > opposite_2:
                    ans += 1

        else:
            if opposite_1 == opposite_2:
                continue
            my_num = a + b % 10
            opposite = opposite_1 + opposite_2 % 10
            if my_num > opposite:
                ans += 1

print("{:.3f}".format(ans / all))

좋은 웹페이지 즐겨찾기