https://www.acmicpc.net/problem/15989
15989번: 1, 2, 3 더하기 4
정수 4를 1, 2, 3의 합으로 나타내는 방법은 총 4가지가 있다. 합을 나타낼 때는 수를 1개 이상 사용해야 한다. 합을 이루고 있는 수의 순서만 다른 것은 같은 것으로 친다. 1+1+1+1 2+1+1 (1+1+2, 1+2+1) 2+2
www.acmicpc.net
백준 - 1, 2, 3 더하기 4 (15989번)
난이도 : Silver 1
알고리즘 : Mathematics, Simulation, (Dynamic Programming)
풀이 소요 시간 : 60분
import sys
input = sys.stdin.readline
def count_cases(n):
if n <= 3:
return n
answer = 0
if n % 6 < 3:
answer += (n>>1) + 1
answer += count_cases(n-3)
else:
answer += (n//3) + 1
answer += ((n>>1)+((n%3)>>1)) * (((n//3)+1)>>1)
return answer
if __name__ == '__main__':
for _ in range(int(input())):
print(count_cases(int(input())))
n의 범위가 10,000보다 작거나 같은 자연수이기 때문에
백준 "동전 1" 문제(2293번)와 동일하게, Dynamic Programming으로 쉽게 풀 수 있는 문제였다.
2293번의 순한 맛 정도 되는 문제.
이렇게 DP로 풀면 시간복잡도가 O(N)이 된다.
하지만 수학적으로 접근해서 점화식을 이용해 풀면,
O(1)으로 해결할 수 있다
구현 연습도 할 겸 O(1)으로 풀어보다가 1시간이나 걸렸다.
시간 단축을 위해 좀 더 집중하는 연습을 해야겠다.
'Algorithm' 카테고리의 다른 글
마법사 상어와 비바라기 (21610번) - 백준 (BOJ) (0) | 2023.04.24 |
---|---|
이차원 배열과 연산 (17140번) - 백준 (BOJ) (0) | 2023.04.24 |
동전 1 (2293번) - 백준 (BOJ) (0) | 2023.04.24 |
등대 (133500번) - 프로그래머스 (Programmers) (0) | 2023.04.24 |
경사로 (14890번) - 백준 (BOJ) (0) | 2023.04.24 |