문제
1660번: 캡틴 이다솜
캡틴 이다솜은 자신의 해적선에 적을 공격하기 위한 대포알을 많이 보관해 놓는다. 다솜이는 미적감각이 뛰어나기 때문에, 대포알은 반드시 사면체 모양으로 쌓아놓아야 한다고 생각한다. 사면
www.acmicpc.net
알고리즘
- 반복문을 통해 각 사면체를 만드는 데 사용되는 대포알의 개수를 list에 저장한다.
- 반복문을 통해 대포알의 개수에 따라 만들 수 있는 사면체를 확인한다.
- 현재 대포알의 개수로 만들 수 있는 사면체중 제일 작은 값을 dp에 저장한다.
코드
pypy3 해결
# pypy3 해결(python3 시간초과)
import sys
n = int(sys.stdin.readline())
balls = [] # 만들 수 있는 사면체
ball = 0
# 반복문을 통해 각 사면체를 만드는데 사용되는 대포알의 개수를 balls에 저장한다.
for i in range(1, 300001):
ball += (i * (i + 1)) // 2
balls.append(ball)
# 사면체를 만드는데 사용되는 대포알의 개수가
# 현재 다솜이의 해적선에 있는 대포알보다 크다면 그 이후의 대포알은 계산 할 필요없다.
if balls[-1] >= n:
break
dp = [float('inf')] * (n + 1)
# 반복문을 통해 대포알의 개수에 따라 만들 수 있는 사면체를 확인
for j in range(1, n + 1):
for k in balls:
# 현재 대포알의 개수로 사면체를 만들 수 있으면
if k == j:
dp[j] = 1
break
# 대포알의 개수로 사면체를 만들 수 없다면
if k > j:
break
# 현재 대포알의 개수로 만들 수 있는 사면체를 확인
dp[j] = min(dp[j], dp[j - k] + 1)
print(dp[n])
github
GitHub - junjange/CodingTest: 내가 푼 코딩 테스트 문제와 해결법
내가 푼 코딩 테스트 문제와 해결법. Contribute to junjange/CodingTest development by creating an account on GitHub.
github.com
'CodingTest > Baekjoon' 카테고리의 다른 글
[baekjoon] 백준 1965번(파이썬): 상자넣기 (0) | 2022.02.09 |
---|---|
[baekjoon] 백준 1024번(파이썬): 수열의 합 (0) | 2022.02.08 |
[baekjoon] 백준 2502번(파이썬): 떡 먹는 호랑이 (0) | 2022.02.06 |
[baekjoon] 백준 2410번(파이썬): 2의 멱수의 합 (0) | 2022.02.03 |
[baekjoon] 백준 2302번(파이썬): 극장 좌석 (0) | 2022.02.02 |