난이도 : D4
문제번호 : 1865
문제 주소 및 출처입니다.
https://swexpertacademy.com/main/code/problem/problemDetail.do?contestProbId=AV5LuHfqDz8DFAXc
목차
1. 문제 설명
2. 문제 해석
3. 소스 코드
1. 문제 설명
동철이가 차린 전자회사에는 N명의 직원이 있다. 그런데 어느 날 해야할 일이 N개가 생겼다. 동철이는 직원들에게 공평하게 일을 하나씩 배분하려고 한다. 직원들의 번호가 1부터 N까지 매겨져 있고, 해야 할 일에도 번호가 1부터 N까지 매겨져 있을 때, i번 직원이 j번 일을 하면 성공할 확률이 Pi, j이다. 여기서 우리는 동철이가 모든 일이 잘 풀리도록 도와주어야 한다. 직원들에게 해야 할 일을 하나씩 배분하는 방법은 여러 가지다. 우리는 여러 방법 중에서 생길 수 있는 “주어진 일이 모두 성공할 확률”의 최댓값을 구하는 프로그램을 작성해야 한다. |
입력
첫 번째 줄에 테스트 케이스의 수 T가 주어진다. |
출력
각 테스트 케이스마다 ‘#x’(x는 테스트케이스 번호를 의미하며 1부터 시작한다)를 출력하고, |
예시
입력 | 출력 |
1 3 13 0 50 12 70 90 25 60 100 |
#1 9.100000 |
2. 문제풀이
확률을 구하는 문제인데 N이 16까지 있기때문에 단순한 dfs만을 이용하면 터질것이다. |
3. 소스코드
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
|
#D4 1865 동철이의 일 분배
#N = 일의 개수 1 <= N <= 16
#각줄은 직원의 성공 확률
def bfs(idx, answer = 100):
global max_value
#값이 계산한 이전값보다 작다면 리턴
if answer <= max_value: return
#위에서 걸러지므로 여기까지 왔다면 그냥 값을 넣는다.
if idx >= N:
max_value = answer
return
#조합을 구해서 bfs하기
for i in range(N):
if use_check[i]:
use_check[i] = False
bfs(idx+1, answer * (success_list[idx][i]) )
use_check[i] = True
T = int(input())
for t in range(1, T+1):
N = int(input())
#람다식을 이용하여 넣을때부터 100으로 나누어 사용
success_list = [list(map(lambda x : int(x)/100, input().split())) for _ in range(N)]
use_check = [True for _ in range(N)]
max_value = 0
bfs(0)
#6자리수로 제한하여 출력
print('#{} {:6f}'.format(t, max_value))
|
'코딩테스트 > SWExpertAcademy' 카테고리의 다른 글
가장빠른 문자열 타이핑 Python(SW Expert Academy, SWEA) (0) | 2020.06.14 |
---|---|
격자판의 숫자 이어 붙이기 Python(SW Expert Academy, SWEA) (0) | 2020.06.13 |
정사각형 방 Python(SW Expert Academy, SWEA) (0) | 2020.06.11 |
행렬찾기 Python(SW Expert Academy, SWEA) (0) | 2020.06.10 |
Contact Python(SW Expert Academy, SWEA) (0) | 2020.06.09 |
댓글