일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | ||||
4 | 5 | 6 | 7 | 8 | 9 | 10 |
11 | 12 | 13 | 14 | 15 | 16 | 17 |
18 | 19 | 20 | 21 | 22 | 23 | 24 |
25 | 26 | 27 | 28 | 29 | 30 | 31 |
- 우선순위큐
- 백트래킹
- DP
- 다시
- 서브쿼리
- 해시
- 다이나믹 프로그래밍
- 크루스칼
- GROUP BY
- DFS
- 자료구조
- 구현
- 다이나믹프로그래밍
- 그리디
- 그래프 이론
- 그래프 탐색
- 수학
- BFS
- 재귀
- 분할정복
- 시뮬레이션
- 에라토스테네스의 체
- 트리
- 브루트포스
- MST
- 다익스트라
- 투포인터
- 플로이드-워셜
- join
- 누적합
- Today
- Total
기록하고 까먹지 말기
17425 본문
날짜 : 2022. .
사용 언어 : python
문제
코드
import sys
m = 1000000
f = [0] * 1000001
g = [0] * 1000001
for i in range(1, m + 1): # 약수
j = 1
while i * j <= m:
f[i*j] += i
j += 1
g[1] = 1
for i in range(2, m + 1):
g[i] = f[i] + g[i - 1]
t = int(sys.stdin.readline())
for _ in range(t):
n = int(sys.stdin.readline())
print(g[n])
풀이
- 이전에 풀었던 문제 17427을 응용하여 풀이한 문제이다.
- 테스트케이스를 입력받고 그에따라 바로바로 연산하는 방식이 아닌, f(n)을 먼저 구하고 이를 이용해 g(n)까지 모두 구한 다음 테스트케이스와 n값을 입력받아 그 값을 차례차례 출력하는 것이 이 문제의 포인트였다.
- 그러므로 일반 for문을 통해 f값들을 구한다.
- 다만 배수의 방식으로 구하기 때문에 A = B * C라고 가정했을 때 오직 B만 A의 약수로 포함시킨다는 점을 이용해 while문을 구성한다. (B는 1부터 A까지 증가하면서 리스트 f의 인덱스에 맞게 값을 추가한다.)
- 한편 g(n) = f(n) + g(n-1) 이라는 점화식이 기존에 도출되었기 때문에 다이나믹 프로그래밍을 활용하여 리스트 g를 구한다.
- 위의 과정을 모두 마친 다음 각각 테스트케이스와 n값들을 입력받은 후 알맞은 아웃풋을 출력한다.
알게된 점
- 배수로 접근해야 한다는 점은 대충 감은 있었지만 에라토스테네스의 체를 활용해서 문제를 풀 수 있다는 것은 조금 의외였다.
참고 사이트
- https://enhjh.tistory.com/38
[백준/수학] 17425 약수의 합(Python, 파이썬)
17427 약수의 합2 문제와 매우 유사한 문제이다. 문제에서 요구하는 조건은 다음과 같다. - f(A) = A의 약수의 합 - g(N) = f(1) + f(2) + ... + f(N) - N이 주어졌을 때, g(N)을 구하는 문제 - 테스트 케이스의 갯
enhjh.tistory.com