[Kotlin] ์ฝœ๋ผ์ธ  ์ถ”์ธก (ํ”„๋กœ๊ทธ๋ž˜๋จธ์Šค ์•Œ๊ณ ๋ฆฌ์ฆ˜)
๋ฐ˜์‘ํ˜•

 

๋ฌธ์ œ

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
        
    }
}

 

 


 

์„ค๋ช…

 

  1. 500๊นŒ์ง€ ๋ฐ˜๋ณต์ด ๋˜๋Š”์ง€ ํ™•์ธํ•˜๊ธฐ ์œ„ํ•ด repeat ๋ณ€์ˆ˜๋ฅผ ์„ ์–ธํ•˜๊ณ , repeat < 500 ๋™์•ˆ ๋ฐ˜๋ณต๋˜๋Š” while๋ฌธ์„ ๋งŒ๋“ ๋‹ค.
  2. n์ด ์ €์žฅํ•˜๋Š” ๊ฐ’์€ ์ƒํ™ฉ์— ๋”ฐ๋ผ Int์˜ ๋ฒ”์œ„๋ฅผ ๋„˜์–ด๊ฐˆ ์ˆ˜ ์žˆ์œผ๋ฏ€๋กœ .toLong()์œผ๋กœ ํ˜•๋ณ€ํ™˜ ์‹œ์ผœ์ค€๋‹ค.
  3. while๋ฌธ ์•ˆ์—์„œ n == 1์ธ ๊ฒฝ์šฐ break, n์ด 1์ด ์•„๋‹Œ ๊ฒฝ์šฐ ์ง์ˆ˜/ํ™€์ˆ˜์— ๋งž์ถ”์–ด ์‹์„ ์ž‘์„ฑํ•œ ๋’ค repeat๋ฅผ 1์”ฉ ์˜ฌ๋ ค์ค€๋‹ค.
  4. ์กฐ๊ฑด์— ๋”ฐ๋ผ ๋ฌดํ•œ ๋ฐ˜๋ณตํ•˜๋‹ค๊ฐ€ n์ด 1์ด ๋˜๊ฑฐ๋‚˜, repeat๊ฐ€ 500์ด ๋˜๋ฉด ๋ฐ–์œผ๋กœ ๋‚˜์˜จ๋‹ค.
  5. 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