읽기 전
- 불필요한 코드나 잘못 작성된 내용에 대한 지적은 언제나 환영합니다.
- 개인적으로 배운 점을 정리한 글입니다.
문제 링크
문제 풀이
처음엔 n에서 가장 가까운 제곱수를 점차 빼나가면 해결될 수 있을 줄 알았는데 32의 경우 25 + 4 + 1 + 1+ 1의 5개항이지만 16 + 16의 2개항으로도 나타낼 수 있기 때문에 무작정 큰 제곱수를 빼나가면 오답을 출력한다. 그렇기 때문에 각 제곱수에 대해 모두 체크한 뒤 그 가운데 최소값을 구해야 했다. 난이도가 꽤 있었던 DP 문제로 아직 미숙했던 것 같다.
python 코드
n = int(input())
dp = [i for i in range(n + 1)] # dp 맵 매핑
board = [i * i for i in range(318)] # 제곱수 기록
for i in range(1, n + 1): # dp맵 각 항에 대해
s = [] # 버퍼 리스트
for j in board: # 각 제곱수에 대해
if j > i: # 제곱수가 인덱스 초과 시 skip
break
s.append(dp[i - j]) # i - 제곱수 좌표 더하기
dp[i] = min(s) + 1 # 버퍼 리스트 중 최소값 + 1
# +1은 앞의 제곱수 for문에서 뺏던 제곱수 몫이다.
print(dp[n])
'Algorithms > Baekjoon' 카테고리의 다른 글
BOJ #6064 카잉 달력 (0) | 2021.05.07 |
---|---|
BOJ #1629 곱셈 (0) | 2021.05.07 |
BOJ #1009 분산처리 (0) | 2021.04.24 |
BOJ #1541 잃어버린 괄호 (0) | 2021.04.24 |
BOJ #1759 암호 만들기 (0) | 2021.04.24 |