본문 바로가기
개발노트/프로그래머스

프로그래머스 콜라츠 추측 코틀린

by 시계속세상은아직돌아가는중 2023. 8. 4.

https://school.programmers.co.kr/learn/courses/30/lessons/12943

 

프로그래머스

코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.

programmers.co.kr

package com.example.answersheet

fun main() {

    var num:Long = 626331
    var r = 0

    while (true){

        if(num == 1L){
            break
        }

        if(num%2 == 0L){
            num = num/2
            r++
        }else{
            num = num*3+1
            r++
        }

        if (r > 500){
            num = -1
            break
        }

    }

    println("시행횟수 :${r} 결과값 :  ${num}")

}
class Solution {
    fun solution(num: Int): Int {
        var nums = num.toLong()
    var r = 0

    while (true){
          if(nums == 1L){
            break
        }
          
        if(nums%2 == 0L){
            nums = nums/2
          
        }else{
            nums = nums*3+1
       
        }
          r++
        
        
        if (r > 500){
            r = -1
            break
        }
      
    }
        return r
    }
}

 

해당 문제를 풀면서 두 가지의 문제점에 봉착했었다.

 

첫 번째로는 주어진 num이 int형이길래 내가 그대로 int형으로 받아 썼던 것 이다.

 

테스트숫자 626331은 정상적인 상황에서는 508번 시행해야지 1이 된다.


하지만 해당 코드에서는 488회라고 떠서 오류가 났는데, 이는 해당 숫자가 콜라츠의 추측을 돌면서 int범위를 넘어가는 숫자를 가져서였다!

따라서 Long형태로 바꾸니 해당 문제는 해결된줄 알았으나....

 

제출하고나니 테스트 케이스 13에 문제가 생겼다.

테스트 케이스 13의 input값이 무엇인지도 모르는 상태에서 어리둥절한 마음에 혼란스러운 마음에 튜터님께 질문드리러간 뒤 혼자 곰곰히 생각해보니 문제를 다시 읽어보자는 생각이 들었다.

 

이 단서조항이 보이는가?

 

1에 대한 예외지정을 해주어야했던 것 이다!

 

내기 초기에 짰던 코드는

 

    while (true){

        if(num%2 == 0L){
            num = num/2
            r++
        }else{
            num = num*3+1
            r++
        }

        if (r > 500){
            num = -1
            break
        }
        
            if(num == 1L){
            break
        }

    }

였다.

 

 r이 500을 초과하거나 num == 1이 되거나 무한루프문 while을 탈출하도록 작성한 코드였다.

즉 이 코드에서는 처음에 1이 들어오면 그 1이 %2가 1이 나오닌깐 콜라츠 추측 알고리즘에 빠져버린다.

 

1이므로 바로 break 즉 탈출해야되는데도 말이다.

 

이는 아래 탈출문을 제일 상단으로 옮김으로써 해결된 문제다.

 

 

해당 문제를 풀면서 

 

테스트 케이스 13번이 다른 숫자들에 비해 무척이나 빠르게 통과하는 모습을 볼 수 있다.

이는 테스트 케티스 13은 다른 케이스보다 작은수라는 의미라는 것을 튜터님께서 알려주시며, 앞으로 알고리즘 문제를 접근하면서 틀린 케이스에 대한 추측법을 알려주셨다.

 

한 문제를 풀면서 꽤나 얻어가는 것이 많은 것 같다.