반응형
https://www.acmicpc.net/problem/1010
1010번: 다리 놓기
입력의 첫 줄에는 테스트 케이스의 개수 T가 주어진다. 그 다음 줄부터 각각의 테스트케이스에 대해 강의 서쪽과 동쪽에 있는 사이트의 개수 정수 N, M (0 < N ≤ M < 30)이 주어진다.
www.acmicpc.net
해결 방법 : DP
- 왼쪽 사이트 N은 모두 채워지므로, 오른쪽 사이트 M에 대해 N개를 뽑는 '조합'이 구하고자 하는 값과 같다.
- (M개중에 선별된 N개의 사이트에 겹치지 않도록 순차적으로 다리를 놓을것이기 때문에 더 이상 고려할 부분 X)
- nCr = nCr-1 + n-1Cr-1
- 다리 3개 중에서 2개를 고르는 조합 = 3C2
- 마지막 다리 하나를 제외하고 2개를 고르는 조합 = 2C2
- 마지막 다리 하나를 포함하고 2개를 고르는 조합 = 2C1
import sys
input = sys.stdin.readline
def solution(NM):
N = M = 31 # maximum
dp = [[1]*M for _ in range(N)]
for n in range(1, N):
for m in range(n, M):
if n == m: # n == m이면 경우의 수는 1
continue
dp[n][m] = dp[n][m-1] + dp[n-1][m-1] # mCn = m-1Cn + m-1Cn-1
answer = ''
for N, M in NM:
answer += str(dp[N][M]) + '\n'
return answer[:-1]
if __name__ == '__main__':
T = int(input())
NM = [map(int, input().split()) for _ in range(T)]
result = solution(NM)
print(result)
반응형
'IT study > 알고리즘 문제 풀이' 카테고리의 다른 글
프로그래머스 : 더 맵게 (0) | 2021.06.28 |
---|---|
백준 15486 : 퇴사 2 (0) | 2021.06.24 |
프로그래머스 : 예상 대진표 (0) | 2021.06.24 |
프로그래머스 : 섬 연결하기 (0) | 2021.06.24 |
프로그래머스 : 기지국 설치 (0) | 2021.06.22 |