2024. 3. 12. 10:17, ๐กAlgorithm
๋ฐ์ํ
๋ฌธ์
https://school.programmers.co.kr/learn/courses/30/lessons/12943
์ ๊ทผ
- while๋ฌธ์์ if๋ฅผ ๋ถ๊ธฐ์์ผ 500๋ฒ๊น์ง ๋ฐ๋ณต์ํค๊ณ , 500๋ฒ ์์์ return ๊ฐ ์ถ๋ ฅ, ๋ฐ์์ -1 ์ถ๋ ฅ
- ์ฒ์ ๊ตฌ์ํ ๋ฐฉ์์ ๋ณ ๋ค๋ฅธ ๊ณ ๋ฏผ ์์ด ์๋์ ๊ฐ์ ๋ฐฉ์์ด์๋ค.
// ๊ตฌ์ (๊ฒฐ๊ณผ๊ฐ ๋ค๋ฆ)
class Solution {
fun solution(num: Int): Int {
var repeat = 0
var num = num
while(repeat <= 500){
if(num == 1){
break
}
else if(num % 2 == 0) {
num = num / 2
}else{
num = (num * 3) +1
}
repeat++
}
if (repeat <= 500) return repeat else return -1
}
}
- ์๋ฌด ์๊ฐ ์์ด ์ฝ๋๋ฅผ ์ง๋ค๋ณด๋ var num = num์ผ๋ก ์ ์ธํด ๋ฒ๋ ธ๋ค.
๋์ค์ ์ฝ๋์งค ๋ ๋ฌธ์ ๊ฐ ์๊ธฐ ์ํด์ var n = num ์ผ๋ก ์ค์ ํ๊ณ ๋ชจ๋ n์ผ๋ก ๋ฐ๊ฟ์ฃผ๋ ๊ฒ ๋ง๋ค. - repeat < 500 ์ผ๋ก ๋ถ๋ฑํธ๋ฅผ ์ค์ ํด์ผ 500๋ฒ๊น์ง ๋ฐ๋ณตํ๋ค. '<=' ๋ ์๋ชป๋์๋ค.
- ๊ทธ๋ฐ๋ฐ ์๋ฌด๋ฆฌ ์์ ๊ฐ์ด ์์ ์ ํด์ค๋ n์ด 626331์ธ ๊ฒฝ์ฐ์ ๊ฒฐ๊ณผ๊ฐ์ด -1์ด ์๋ 488์ด ๋์๋ค.
- (num * 3) + 1 ๋ถ๋ถ์์ Int์ ๋ฒ์๋ฅผ ์ด๊ณผํ๊ธฐ ๋๋ฌธ์ด๋ค.
- ๋๊ฐ Long์ผ๋ก ๋ณ์ n์ ์๋ฃํ์ ์์ ํด ์ฃผ์๋ค.
์ฑ๊ณต ์ฝ๋
class Solution {
fun solution(num: Int): Int {
var repeat = 0
var n = num.toLong()
while(repeat < 500){
if(n == 1L){
break
}
else if(n % 2 == 0L) {
n = n / 2
}else{
n = n * 3 + 1
}
repeat++
}
if (repeat < 500) return repeat else return -1
}
}
์ค๋ช
- 500๊น์ง ๋ฐ๋ณต์ด ๋๋์ง ํ์ธํ๊ธฐ ์ํด repeat ๋ณ์๋ฅผ ์ ์ธํ๊ณ , repeat < 500 ๋์ ๋ฐ๋ณต๋๋ while๋ฌธ์ ๋ง๋ ๋ค.
- n์ด ์ ์ฅํ๋ ๊ฐ์ ์ํฉ์ ๋ฐ๋ผ Int์ ๋ฒ์๋ฅผ ๋์ด๊ฐ ์ ์์ผ๋ฏ๋ก .toLong()์ผ๋ก ํ๋ณํ ์์ผ์ค๋ค.
- while๋ฌธ ์์์ n == 1์ธ ๊ฒฝ์ฐ break, n์ด 1์ด ์๋ ๊ฒฝ์ฐ ์ง์/ํ์์ ๋ง์ถ์ด ์์ ์์ฑํ ๋ค repeat๋ฅผ 1์ฉ ์ฌ๋ ค์ค๋ค.
- ์กฐ๊ฑด์ ๋ฐ๋ผ ๋ฌดํ ๋ฐ๋ณตํ๋ค๊ฐ n์ด 1์ด ๋๊ฑฐ๋, repeat๊ฐ 500์ด ๋๋ฉด ๋ฐ์ผ๋ก ๋์จ๋ค.
- repeat(๋ฐ๋ณต๊ฐ)์ด 500๋ณด๋ค ์์ ๊ฒฝ์ฐ repeat๋ฅผ ๊ฒฐ๊ณผ๊ฐ์ผ๋ก ๋ฐํํ๊ณ , ๋ ํฐ ๊ฒฝ์ฐ -1์ ๋ฐํํ๋ค.
๋ค๋ฅธ ๋ฐฉ๋ฒ
class Solution {
fun solution(num: Int): Int = collatzAlgorithm(num.toLong(),0)
tailrec fun collatzAlgorithm(n:Long, c:Int):Int =
when{
c > 500 -> -1
n == 1L -> c
else -> collatzAlgorithm(if( n%2 == 0L ) n/2 else (n*3)+1, c+1)
}
}
- tailrec์ด๋ผ๋ ๊ผฌ๋ฆฌ์ฌ๊ทํจ์๋ฅผ ์ด์ฉํ ํ์ด๋ค.
- ์ฝ๋ผ์ธ ์ถ์ธก์ ๊ตฌํํ ํจ์์ธ solution๊ณผ ์ด๋ฅผ ์ฌ๊ท์ ์ผ๋ก ํธ์ถํ๋ collatzAlgorithm ํจ์๋ก ๊ตฌ์ฑ
- solution ํจ์
- solution ํจ์๋ ์ฃผ์ด์ง num์ Int๋ก ๋ฐ์์ collatzAlgorithm ํจ์์ ์ ๋ฌ
- ๋ฐํ ๊ฐ์ collatzAlgorithm ํจ์์ ๋ฐํ ๊ฐ - collatzAlgorithm ํจ์
- collatzAlgorithm ํจ์๋ ์ฝ๋ผ์ธ ์ถ์ธก ์๊ณ ๋ฆฌ์ฆ์ ์ฌ๊ท์ ์ผ๋ก ๊ตฌํ
- n๊ณผ c ๋ ๊ฐ์ ๋งค๊ฐ๋ณ์๋ฅผ ๊ฐ์ง๋ฉฐ, n์ ํ์ฌ ์์ด๊ณ c๋ ์ด์ ๊น์ง์ ๋ฐ๋ณต ํ์๋ฅผ ๋ํ๋ - when ํํ์์ ์ฌ์ฉํ์ฌ ์ธ ๊ฐ์ง ๊ฒฝ์ฐ๋ฅผ ์ฒ๋ฆฌ
(1) c > 500์ผ ๋: ๋ฐ๋ณต ํ์๊ฐ 500์ ์ด๊ณผํ๋ฉด -1์ ๋ฐํ
(2) n == 1L์ผ ๋: ํ์ฌ ์๊ฐ 1์ด๋ฉด ํ์ฌ๊น์ง์ ๋ฐ๋ณต ํ์์ธ c๋ฅผ ๋ฐํ
(3) ๊ทธ ์ธ์ ๊ฒฝ์ฐ: ํ์ฌ ์๊ฐ ์ง์์ธ์ง ํ์์ธ์ง์ ๋ฐ๋ผ ๋ค์ ์๋ฅผ ๊ฒฐ์ ํ๊ณ , ์ด์ ๋ฐ๋ณต ํ์ c์ 1์ ๋ํ์ฌ ์ฌ๊ท์ ์ผ๋ก ๋ค์ collatzAlgorithm์ ์ํํ์ฌ ๋ค์ ์๋ฅผ ๊ณ์ฐ - ํจ์๋ tail-recursive๋ก ๊ตฌํ๋์ด ์์ผ๋ฉฐ, ์ฌ๊ท ํธ์ถ์ด ํจ์์ ๋ง์ง๋ง ์ฐ์ฐ์ผ๋ก ์ํ๋จ.
์ด๋ฅผ ํตํด ๋ฉ๋ชจ๋ฆฌ๋ฅผ ์ ์ฝํ ์ ์์
๋ฐ์ํ
๐ฌ C O M M E N T