BOJ 14717 앉았다
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. 땡 일 경우.
- 상대가 끗이라면 언제나 승리.
- 상대의 패 숫자가 본인보다 작으면 승리.
- 끗일 경우.
- 상대가 땡이면 패배.
- 끗의 경우 두 수를 더해 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))
Author And Source
이 문제에 관하여(BOJ 14717 앉았다), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://velog.io/@jsin2475/BOJ-14717-앉았다저자 귀속: 원작자 정보가 원작자 URL에 포함되어 있으며 저작권은 원작자 소유입니다.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)