์ด๊ฒ ์ ๊ณจ๋์ง? ํ๋ค๊ฐ ์์ฃผ๊ทธ๋ฅ ํธ์ค์จ๋ฌ๋ ๋ฌธ์ !!
๐ ๋ฌธ์
https://www.acmicpc.net/problem/17425
๋ญ์ผ! ์ด์ ์ ํ์๋ '์ฝ์์ํฉ2'๋ฌธ์ ๋ ๋๊ฐ์์? ๊ทผ๋ฐ ๊ทธ๋ฅ , ์ ๋ ฅ๋ง ๋ค๋ฅด๊ฒ ํ๋ฉด ๋๋๊ฑฐ์์!!!
๐ ์๊ฐ์ด๊ณผ ^___^
์ฌ์ง์ด ์ ๋ ฅ ๋ฐฉ์๋ ์๋ชป์์๋ค. ์ด๋ฐ์ ์ ๋ ฅ๋๋ 5๋ฅผ ๋ชป๋ณด๊ณ , ๊ทธ๋ฅ ๋์์ด ์ ๋ ฅ์ด ๊ฐ๋ฅํ? ๋ฌธ์ ์ธ์ค ์๊ณ while์ผ๋ก ์์ฑํ๋ค.
while let N = Int(readLine()!) {
print(solution(N))
}
private func solution(_ N: Int) -> Int {
let N = N ?? 0
var sum = 0
for i in 1..<N+1 {
sum += (N / i) * i
}
return sum
}
์ฅ,, ์๊ฐ์ด๊ณผ๋ค? ์ผ๋จ, ์ด๋ฐ์ N๊ฐ๋ฅผ ์ ๋ ฅํ ๊ฑฐ๋ผ๋ T๋ฅผ ์ ๋ ฅ๋ฐ์์ด์ผํ๋๋ฐ, ๋๋ ๋์์ด ์ ๋ ฅ์ด ๊ฐ๋ฅํ๊ฒ ์ฝ๋๋ฅด ์์ฑํด์ ํ๋ฆฐ์ค ์์๋ค. ๊ทผ๋ฐ ,, ์ด๋ฌธ์ ๋ ์๋์๋ค.!!
์ ๋ ฅ์ ์ ๋๋ก ๋ฐ์๋ ์๊ฐ์ด๊ณผ์๋ค.
๐ ํด๊ฒฐ๋ฐฉ๋ฒ์ ์๊ฐํด๋ณด์
์ฐ์ , ์์ ๋ฅผ๋ณด๋ฉด, T = 5 ์ ์ ๋ ฅ๋ฐ๋๋ค. ๋ด ์ฝ๋๋ฅผ ๋ณด๋ฉด, ๋ง์ฝ 5๋ฒ์ ์ ๋ ฅ๋ฐ์ผ๋ฉด, 5๋ฒ ๋ชจ๋ g(N)์ ๊ณ์ฐํ๊ธฐ ์ํด์ ์ฐ์ฐ์ ๋ฐ๋ณตํ๋ค.
์์ ์ํฉ์ผ๋ก ์๊ฐํด๋ณด๋ฉด
g(1) ์ ๊ตฌํ๊ธฐ ์ํด์ f(1) ๊ตฌํ๊ณ sum์ธ f(1) ๊ตฌํจ
g(2) ๋ฅผ ๊ตฌํ๊ธฐ ์ํด์ f(1), f(2) ๊ตฌํ๊ณ sum ์ธ f(1) + f(2) ๊ตฌํจ
g(10)์ ๊ตฌํ๊ธฐ ์ํด์ f(1), f(2), f(3), f(4), f(5)....f(10) ๊ตฌํ๊ณ , sum ์ธ f(1)+f(2)+f(3)+...+f(10) ๊ตฌํจ
.......
์ด๋ ๊ฒ ๋ฐ๋ณต๋๋ค.
์ธ๋ฐ์๋ ์ฐ์ฐ์ด ๋ง์์ก๋ค. f(2)๋ฅผ ์ด์ ์ ๊ตฌํด๋จ๋๋ฐ, ์ด๋ฅผ ์ฌ์ฌ์ฉํ ์ ์์๊น? ๋, ์ง๊ธ ์์ ์์๋ง ์ด์ ๋์ง, ๋ง์ฝ T = 100000 ์ ์ ๋ ฅ๋ฐ๊ฒ ๋๋ฉด, 10๋ง๋ฒ์ ์ฐ์ฐํด์ค์ผํ๋ค. ์ด ์ฐ์ฐ์ ์ค์ด๊ธฐ ์ํด์๋,,, dp ํํ๋ก ๋ง๋ค์ด์ค์ผ๊ฒ ๋ค๊ณ ํ๋จํ๋ค.
์ฆ, ๋ชจ๋ ๋ต์ ๋ฏธ๋ฆฌ ๊ตฌํด๋๊ณ , ๋ง์ง๋ง์ ์ ๋ ฅ๋ฐ๋ i ์ ๋ํด์ dp[i]๋ฅผ ๋ฐ๋ก ์ถ๋ ฅํ ์ ์๊ฒ ๋ง๋ค์ด ๋๋ ๊ฒ์ด๋ค.
[ f(1), f(1)+f(2), f(1)+f(2)+f(3), f(1)+f(2)+f(3)+f(4), ,,,,,,, f(1)+..+f(100000) ]
์ด๋ ๊ฒ ๊ตฌํด๋ณด์.
๐ ์ฒซ๋ฒ์งธ ์๋
์ด๋ ๊ฒ ์ฝ๋๋ฅผ ์์ฑํ๋ค.
[ f(1), f(1)+f(2), f(1)+f(2)+f(3), f(1)+f(2)+f(3)+f(4), ,,,,,,, f(1)+..+f(100000) ]
์ด ํํ๋ฅผ ๋ง๋ค๊ธฐ ์ํด์, div๋ผ๋ ๋ฐฐ์ด์ ๋ง๋ค์๊ณ , div๋ i์ ์ฝ์์ ํฉ์ ๋ฃ์ด๋ ๊ฒ์ด๋ค. ์ด ๋ฉ์๋๋ฅผ ๊ตฌํ๋ ๊ฒ์ ๋ํด์๋ ์๊ฐ์ด ์กฐ๊ธ ํ์ํ๋๋ฐ, ์ธํฐ๋ท์ ์กฐ๊ธ ,, ๋ค์ ธ๋ดค๋ค ๋ฏธ๋ฆฌ ๊ตฌํ๊ธฐ ์ํด์๋ 1์ ๋ฐฐ์์ 1์ฉ ๋ํด์ฃผ๊ณ , 2์ ๋ฐฐ์์๋ 2๋ฅผ ๋ํด์ฃผ๊ณ , 3์ ๋ฐฐ์์๋ 3์ ๋ํด์ฃผ๊ณ ,,, ์ด๋ฐ์์ผ๋ก 100๋ง๊น์ง ๊ฐ i์ ์ฝ์์ ํฉ์ ๊ตฌํด์ฃผ์๋ค. ๊ทธ ๋ฐฐ์ด์ด ๋ฐ๋ก div
๊ทธ๋ฆฌ๊ณ sum ๋ฐฐ์ด์ ๋์ ํฉ์ ๊ตฌํด์ฃผ์๋ค.
private func solution() {
let accumulate = accumulateSum()
let T = Int(readLine()!)!
for _ in 0..<T {
let num = Int(readLine()!)!
print(accumulate[num])
}
}
private func accumulateSum() -> [Int] {
var div = Array(repeating: 0, count: 1000000)
var sum = Array(repeating: 0, count: 1000000)
for i in 1...1000000 {
var j = 1
while i*j < 1000000 {
div[i*j] += j
j += 1
}
}
sum[1] = div[1]
for i in 2..<div.count {
sum[i] = sum[i-1] + div[i]
}
return sum
}
solution()
์ญ
๋ฐํ์์๋ฌ..? ์ด๋ ์์ธ๋ฅผ ๋ชป์ก์๋๋ณด๋ค.. ๋๋์ฒด ๋ญ๊น!
๐ ์ ๋ต ์ฝ๋
๋ฐํ์ ์๋ฌ์ ๋ฌธ์ ๋ ๋ฒ์์๋ค.
var div = Array(repeating: 0, count: 1000000)
var sum = Array(repeating: 0, count: 1000000)
while i*j < 1000000 { .. }
div ์ sum์ ์ด๋ ๊ฒ ์ค์ ํด์ฃผ๊ณ while๋ฌธ์ 1000000 ๋ฏธ๋ง์ผ๋ก ์ค์ ํด์ฃผ์๋ค. ์ด๋ ๊ฒ ํ๊ฒ ๋๋๊น, N์ ์ต๋๊ฐ์ธ 1000000์ ์ ๋ ฅํ ์ ์์๋ค. ๊ทธ๋์ ๋ฒ์๋ฅผ ์กฐ์ ํด์ฃผ๋ฉด์ ๋ฐํ์์๋ฌ๋ฅผ ํด๊ฒฐํ๋ค!
private func solution() {
let accumulate = accumulateSum()
let T = Int(readLine()!)!
for _ in 0..<T {
let num = Int(readLine()!)!
print(accumulate[num])
}
}
private func accumulateSum() -> [Int] {
var div = Array(repeating: 0, count: 1000001)
var sum = Array(repeating: 0, count: 1000001)
for i in 1...1000000 {
var j = 1
while i*j <= 1000000 {
div[i*j] += j
j += 1
}
}
sum[1] = div[1]
for i in 2..<div.count {
sum[i] = sum[i-1] + div[i]
}
return sum
}
solution()
'Algorithm > Baekjoon' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[๋ฐฑ์ค] (Swift) 1978๋ฒ - ์์์ฐพ๊ธฐ (feat. ์ ๊ณฑ๊ทผ, ์๋ผํ ์คํ ๋ค์ค์ ์ฒด) ์ง๋ฌธ์์ต๋๋ค,,, ํ (2) | 2022.12.26 |
---|---|
[๋ฐฑ์ค] (Swift) 2609๋ฒ - ์ต๋๊ณต์ฝ์์ ์ต์๊ณต๋ฐฐ์ (0) | 2022.12.25 |
[๋ฐฑ์ค] (Swift) 17427๋ฒ - ์ฝ์์ ํฉ2 (0) | 2022.12.23 |
[๋ฐฑ์ค] (Swift) 1037๋ฒ - ์ฝ์ (0) | 2022.12.23 |
[๋ฐฑ์ค] (Swift) 11403๋ฒ - ๊ฒฝ๋ก์ฐพ๊ธฐ (DFS๋ก ํ๊ธฐ) (2) | 2022.09.19 |