๐ ์ฝ๋ฉํ ์คํธ ๋ฌธ์ ํ์ด
โ๐ป ๋ฌธ์ ํ์ด github ๋งํฌ
๋ฌธ์ ์ค๋ช
ํจ์ง์ด๋ ๋ฉ๋ฆฌ ๋ฐ๊ธฐ๋ฅผ ์ฐ์ตํ๊ณ ์์ต๋๋ค. ํจ์ง์ด๋ ํ๋ฒ์ 1์นธ, ๋๋ 2์นธ์ ๋ธ ์ ์์ต๋๋ค. ์นธ์ด ์ด 4๊ฐ ์์ ๋, ํจ์ง์ด๋
(1์นธ, 1์นธ, 1์นธ, 1์นธ)
(1์นธ, 2์นธ, 1์นธ)
(1์นธ, 1์นธ, 2์นธ)
(2์นธ, 1์นธ, 1์นธ)
(2์นธ, 2์นธ)
์ 5๊ฐ์ง ๋ฐฉ๋ฒ์ผ๋ก ๋งจ ๋ ์นธ์ ๋๋ฌํ ์ ์์ต๋๋ค. ๋ฉ๋ฆฌ๋ฐ๊ธฐ์ ์ฌ์ฉ๋ ์นธ์ ์ n์ด ์ฃผ์ด์ง ๋, ํจ์ง์ด๊ฐ ๋์ ๋๋ฌํ๋ ๋ฐฉ๋ฒ์ด ๋ช ๊ฐ์ง์ธ์ง ์์๋ด, ์ฌ๊ธฐ์ 1234567๋ฅผ ๋๋ ๋๋จธ์ง๋ฅผ ๋ฆฌํดํ๋ ํจ์, solution์ ์์ฑํ์ธ์. ์๋ฅผ ๋ค์ด 4๊ฐ ์ ๋ ฅ๋๋ค๋ฉด, 5๋ฅผ returnํ๋ฉด ๋ฉ๋๋ค.
์ ํ ์ฌํญ
- n์ 1 ์ด์, 2000 ์ดํ์ธ ์ ์์ ๋๋ค.
์ ์ถ๋ ฅ ์
n | result |
4 | 5 |
3 | 3 |
์ ์ถ๋ ฅ ์ ์ค๋ช
์ ์ถ๋ ฅ ์ #1
์์์ ์ค๋ช ํ ๋ด์ฉ๊ณผ ๊ฐ์ต๋๋ค.
์ ์ถ๋ ฅ ์ #2
(2์นธ, 1์นธ)
(1์นธ, 2์นธ)
(1์นธ, 1์นธ, 1์นธ)
์ด 3๊ฐ์ง ๋ฐฉ๋ฒ์ผ๋ก ๋ฉ๋ฆฌ ๋ธ ์ ์์ต๋๋ค.
๋ฌธ์ ํ์ด
๋์ ํ์ด
์ฒซ ๋ฒ์งธ ํ์ด ( ์ ํ์ฑ : 31.3 % )
func solution(_ n:Int) -> Int {
var count = 0
var dividend = 0
var divisor = 0
for k in 0...n/2 {
if k == 0 || ( k % 2 == 0 ) && ( k == n/2 ) {
count += 1
}else {
let i = n - 2 * k
if i < k {
dividend = stride(from: n-k, to: k, by: -1).reduce(1) { $0 * ( $1 % 1234567 ) }
divisor = (1...i).reduce(1) { $0 * ( $1 % 1234567 ) }
}else {
dividend = stride(from: n-k, to: i, by: -1).reduce(1) { $0 * ( $1 % 1234567 ) }
divisor = (1...k).reduce(1) { $0 * ( $1 % 1234567 ) }
}
count += ( dividend / divisor ) % 1234567
}
}
return count % 1234567
}
์ฒซ ๋ฒ์งธ ํ์ด๋ ํ๋ฅ ๊ณผ ํต๊ณ์์์ "๊ฐ์ ๊ฒ์ด ์๋ ์์ด"์ ํตํด ํ์ด๋ณด๋ ค๊ณ ํ๋ค. ๋๋จธ์ง ์ ๋ฆฌ๋ฅผ ์ด์ฉํ์ฌ ๊ฐ์ ๊ณฑํ ๋๋ง๋ค 1234567๋ก ๋๋ ๋๋จธ์ง๋ฅผ ๊ตฌํ์๋ค. ํ์ง๋ง, n์ด 2000์ด๋ ๋๊ธฐ ๋๋ฌธ์ ์ด๋ป๊ฒ ํ๋ Int์ ์ต๋๊ฐ์ ๋๊ธธ ์ ๋ฐ์ ์์๋ค.
๋ ๋ฒ์งธ ํ์ด ( ์ ํ์ฑ : 37.5% )
func solution(_ n:Int) -> Int {
func sol(_ n: Int) -> Int {
switch n {
case 2:
return 2
case 1:
return 1
default:
return (sol(n-1)%1234567) + (sol(n-2)%1234567)
}
}
return sol(n) % 1234567
}
์ฌ๋ฌ ๊ฒฝ์ฐ์ ์๋ฅผ ๋ณด๋ค๋ณด๋ ์ ํ์์ด ๋ณด์๋ค. ์ฌ๊ทํจ์๋ฅผ ํตํ์ฌ ํ๋ ค๊ณ ํ์ง๋ง, n์ด ์ต๋๊ฐ์ด 2000์ด ๋๋ค๋ฉด, ์ต๋๋ก ๋ฐ๋ณต๋๋ ๊ฐ์ 2์ 1998์น์ผ ๊ฒ์ด๋ค. ์๊ฐ์ด๊ณผ๋ก ์ธํด์ ์ด ๋ฐฉ๋ฒ๋ ํ๋ฆฐ ๋ฐฉ๋ฒ์ด์๋ค. ํ์ฐธ์ ๊ณ ๋ฏผํด๋ด๋ ๋ต์ด ๋์ค์ง ์์ ํํ จ๋์ ์ฐพ์๊ฐ ํํธ๋ฅผ ์ป์ด๋ณด์๋ค.
์ธ ๋ฒ์งธ ํ์ด ( ์ ๋ต! )
func solution(_ n:Int) -> Int {
if n == 1 {
return 1
}else if n == 2 {
return 2
}
var dp = [Int](repeating: 0, count: n)
dp[0] = 1
dp[1] = 2
for i in 2..<n {
dp[i] = ( dp[i-1] + dp[i-2] ) % 1234567
}
return dp[n-1] % 1234567
}
์ ๋ต์ DP( dynamic Programming ) ์ผ๋ก ํธ๋ ๊ฒ์ด์๋ค. ๋ด๊ฐ ํผ ์ฌ๊ทํจ์์์์ ํ์ด๋ฅผ ์์ธํ ์ดํด๋ณด๋ฉด, sol(8)์ ์ด๋ฏธ ๊ณ์ฐ์ ํ์์๋ ๋ค์ sol(8)์ ๊ณ์ฐํ์ฌ์ผ ํ๋ค. ๋ฐ๋ณต์ ์ธ ํ์ด๋ฅผ ๋ง๊ธฐ์ํด ์ด๋ฏธ ๊ณ์ฐ๋ ๊ฐ์ ๋ฐฐ์ด์ ์ ์ฅํ๋ค. ์ฌ์ค sol(8)์ ๋ฐ๋ณต์ ์ผ๋ก ๊ณ์ฐํ์ง ์๊ธฐ ์ํด์๋ ํฐ ์์์ ์์ ์๋ก์ ๊ณ์ฐ์ด ์๋ ์์ ์์์ ํฐ ์๋ก ์ ํ์์ ์ฌ์ฉํ์ฌ ํ์ด์ผ ํ๋ค.
๊ทธ ๊ณผ์ ์์ ์ด์ ๊ฐ์ ํ์ด๊ฐ DP๋ฅผ ์ด์ฉํ ํ์ด๋ฒ์ด๋ผ๋ ๊ฒ์ ์๊ฒ ๋์๋ค. for๋ฌธ์ ํด๋นํ์ง ์๋ 1๊ณผ 2์ ๊ฐ์ if ๋ฌธ์ผ๋ก ๋นผ๋๊ณ , ๋๋จธ์ง๋ ์ ํ์์ ์ด์ฉํ์ฌ ํ์๋ค. ํ์ด๊ฐ ๊ต์ฅํ ๊น๋ํ๋ฉด์ ์์ฒญ ๋น ๋ฅธ ์๋๋ก ํ ์ ์์๋ค.
๋ค์์๋ ๋์ ๊ณํ๋ฒ ๋ฌธ์ ๊ฐ ๋์จ๋ค๋ฉด ๋ฐ๋ก ํ ์ ์๋๋ก ๋์ ๊ณํ๋ฒ(DP)์ ๋ํด ๊ณต๋ถํด๋ณด์.