[Python] 백준 알고리즘 1010번 - 다리 놓기
2022. 7. 30. 15:56ㆍ알고리즘/문제풀이
[Python] 백준 알고리즘 1010번 - 다리 놓기
문제 출처: 1010번: 다리 놓기 (acmicpc.net)
1010번: 다리 놓기
입력의 첫 줄에는 테스트 케이스의 개수 T가 주어진다. 그 다음 줄부터 각각의 테스트케이스에 대해 강의 서쪽과 동쪽에 있는 사이트의 개수 정수 N, M (0 < N ≤ M < 30)이 주어진다.
www.acmicpc.net
접근 방법
접근은 조합으로 접근을 하였다.
1 ) 파이썬 자체 내장 팩토리얼 메서드 이용
2 ) 팩토리얼을 동적계획법으로 구하고 그 나온 수를 이용해서 조합의 구조로 답출력
동적계획법을 넣기 위해 2번의 방식을 선택했다. 문제에서 주어진 숫자의 범위는
0 <= n <= m < 30이다. 즉 팩토리얼을 29까지만 계산 후 원하는 답의 형태로 뽑아내고 출력하는 방식을 선택했다.
시간 복잡도는 초반에 동적계획법을 사용하는 o(n) * 타겟팅 번호를 출력하는 o(1)
최종 시간복잡도는 O(n)이라고 생각합니다.
조합 : [Python] 백준 알고리즘 2407번 - 조합 (tistory.com)
[Python] 백준 알고리즘 2407번 - 조합
[Python] 백준 알고리즘 2407번 - 조합 문제 출처 : https://www.acmicpc.net/problem/2407 2407번: 조합 n과 m이 주어진다. (5 ≤ n ≤ 100, 5 ≤ m ≤ 100, m ≤ n) www.acmicpc.net 접근 방식..
skyriv312079.tistory.com
기존 조합 문제와 다르게 팩토리얼 부분을 다이나믹 프로그래밍의 메모이제이션 기법을 사용해서 구했다.
풀이코드
t = int(input())
memo = [1 for i in range(30)]
for i in range(2, 30):
memo[i] = i * memo[i - 1]
for _ in range(t):
n, m = map(int, input().split())
print(memo[m] // (memo[n] * memo[m - n]))
'알고리즘 > 문제풀이' 카테고리의 다른 글
[Python] 백준 알고리즘 15649번 - N과 M(1) (0) | 2022.10.06 |
---|---|
[Python] 백준 알고리즘 11053번 - 가장 긴 증가하는 부분 수열 (0) | 2022.07.31 |
[Python] 백준 알고리즘 11726 - 2 x n 타일링 (0) | 2022.07.30 |
[Python] 백준 11728 - 배열 합치기 (0) | 2022.06.27 |
[Python] 백준 알고리즘 1302번 - 베스트셀러 (0) | 2022.05.06 |