https://www.acmicpc.net/problem/3360
3360번: 깡총깡총
CTP마을에 사는 토끼 아람이는 3,2,1미터씩 뛰어서 n미터를 지난다. 람토끼가 지나야하야 하는 길이가 주어졌을 때 점프 길이가 증가하지 않는 순서로 지나가는 방법은 총 몇 가지가 있을까? 찾
www.acmicpc.net
토끼가 3,2,1 미터씩 N 미터를 지난다.
이 때 길이가 증가하지 않는 순서로 지나가는 방법을 구하는 문제이다.
처음에는 재귀함수로 하려고 했는데 메모리가 초과되었다.
재귀함수보다 직접 계산하는 방법은 3을 맨 왼쪽으로 고정시키는 것이다.
그리고 2를 나눠줘서 2가 들어있는 갯수를 구해준다.
마지막에 +1 을 하는 이유는 1만으로 이뤄진 식을 고려하는 것이다.
이거 안해줘서...(っ °Д °;)っ
import sys
sys.setrecursionlimit(10**6)
N = int(sys.stdin.readline())
num = 0
def count(x,last):
global num
if x == 0:
num += 1
return
elif x<0:
return
else:
if last == 3:
count(x-3,3)
count(x-2,2)
count(x-1,1)
elif last == 2:
count(x-2,2)
count(x-1,1)
elif last == 1:
count(x-1,1)
count(N,3)
print(num)
Python 으로 제출했더니 시간초과가 떠서, Pypy로 했다.
import sys
N = int(sys.stdin.readline())
#왼쪽을 고정시키기
num = 0
#3을 고정하면, 나머지는 1,2로 이뤄짐
#+1 은 1만 있는 경우
for i in range(N):
if N >= 3*i:
#2로 나눈 이유는 2가 맨 앞에 있을 수 있는 갯수
num += (N-3*i)//2 + 1
print(num% 1000000)
'알고리즘 공부 > 수학' 카테고리의 다른 글
[백준/수학] 6588번: 골드바흐의 추측 (0) | 2022.10.02 |
---|---|
[백준/수학] 1094번: 막대기 (1) | 2022.10.02 |
[백준/수학] 11689번: GCD(n,k)=1 (0) | 2022.09.18 |
[백준/기하학] 11758번 CCW (0) | 2022.08.21 |
[백준/수학] 7977번 크리스 마틴 (0) | 2022.03.12 |