코틀린(Kotlin)/프로그래머스

[프로그래머스/코틀린(Kotlin)] 콜라츠 추측

초보왕보초 2023. 10. 30. 20:59
728x90

주어진 수가 1이 될 때까지 특정 조건을 반복하는데, 이 작업을 몇 번 반복하는지 리턴하기

but 주어진 수가 1일 경우에는 0을, 작업을 500번 반복할 때까지 1이 되지 않으면 -1 리턴하기

예시)

 

풀이

  • while문을 사용해서 특정 조건일 때 리턴 시키기
  • 짝수일 경우와 홀수일 경우, 1일 경우 세가지 조건
  • 카운트가 500번이 넘어가면 -1 리턴 시키기

 

제출 코드

(코드 해석해 보기)

while문을 사용해서 n이 1이상이면서 작업 횟수가 500 미만일 때 반복시켜 놓고

n이 1이면 cnt = 0으로

n이 짝수면 나누기 2를 한 후 작업횟수++ 반복

그 외(홀수 일 경우)엔 3을 곱한 후 +1 작업횟수++ 반복

return if else로 카운트가 500일 때 -1을 return 시키고 아닐 경우 앞에서 구한 작업횟수 리턴

이 문제는 Int형으로 나왔지만 작업횟수를 반복하다 보면 Long타입이 필요한 경우가 있음..

그래서 n을 롱타입으로 변환했다..

 

하지만,

문제에 n이 1일 경우 0을 반환하라는 조건이 추가된 후 while의 조건을 n>=1L로 넣으니까 계속해서 실행 시간이 초과됐다.. 이번 문제는 도저히 모르겠어서 답지를 찾아봤다..

 

 

다른 사람의 풀이

tailrec이라는 꼬리재귀함수를 사용한다고 한다.

추가적인 연산이 없이 자신이 스스로 재귀적으로 호출하다가 어떤 값을 리턴하는 함수라고 한다.

tailrec은 꼬리재귀를 자원 소비가 적은 루프 코드로 컴파일하는 것을 도와준다고 한다.

 

 

collatz(num.toLong(), 0)에서 0은 c이므로 n이 1로 시작할 땐 c는 0이 리턴되는 듯(?) 하다..

 

 

제출코드랑 별 다른건 없지만 그래도 이건 실행시간이 초과되진 않는다..

728x90