📑 문제 [ 더 보기 클릭! ]
🌱아이디어
여기서 원하는 답은 결국 콜라츠 추측 공식은 결국 마지막엔 1이 돼야 합니다.
그리고 1이 되기까지의 과정의 횟수가 얼마인지를 답을 내야 하는데, 저는 while문을 통해 우선 무한 반복을 시키고 그 안
에서 조건문과 break를 활용하여 answer를 return 시켜 주는 생각을 했습니다.
여기서 주의할 점은 num이 1이라면 0을, 이 작업이 500번 반복할 때까지 1이 되지 않는 다면 -1을 반환해야 합니다.
🔍 코드 및 풀이
class Solution {
// 500번 반복할 때까지 1이 되지 않는다면 -1을 반환
fun solution(num: Int): Int {
var answer = 0
var value = num
while(true){
if(value == 1){
break
} else if(answer == 500){
answer = -1
break
} else {
answer++
if(value % 2 == 0){
value = value / 2
} else{
var temp = value.toDouble()
temp = temp * 3 + 1
value = temp.toInt()
}
}
}
return answer
}
}
우선 계속 사용할 num을 value라는 변수 안에 넣어줍니다.
while(true){ // while 안에 true를 걸어주면서 무한반복
if(value == 1){ // 문제 제한조건
break // while은 무한 반복하기 때문에 조건이 맞다면 break로 탈출해야함
} else if(answer == 500){ // 문제 제한조건
answer = -1
break // while은 무한 반복하기 때문에 조건이 맞다면 break로 탈출해야함
} else { }
그리고 while문을 통해 계속 반복을 시켜주면서 문제 조건을 설정해 줍니다.
위처럼 문제의 제한조건을 다 걸어줬다면 콜라츠 추측을 해줍니다.
짝수를 구하는 공식 if( 값 % 2 == 0 )
홀수를 구하는 공식 if( 값 % 2!= 0 )
이 공식을 대입해서 콜라츠 추측을 한다면
while(true){
// ...중략 ( 위 코드 블럭 참고 )
} else { // 제한 조건이 다 아니라면..
answer++ // 반복되는 과정을 계속 더해줍니다.
if(value % 2 == 0){ // 짝수 구하는 공식
value = value / 2
} else{ // 짝수가 아니라면.. ( 홀수 )
var temp = value.toDouble() // 3을 곱하기 때문에 Int형을 벗어날때가 있다.
temp = temp * 3 + 1
value = temp.toInt()
}
}
}
위 코드에서 추가 설명을 하자면
var temp = value.toDouble 부분에서 Double로 바꿔주는 이유로
홀수 일 때는 3을 곱하고 1을 더하기 때문에 n의 크기에 따라서 Int형 범위를 넘어 버립니다.
Int = 4바이트
Double = 8바이트
이기에 Double로 잠시 바꿔주고 마지막에 다시 Int형으로 바꿔줍니다.
📗 느낀 점
이번 문제를 풀 때 어려움은 없었습니다. 바로 캐치하긴 했지만 홀수 계산식에서 Int형 범위를 넘어가기 때문에 Int보다 크기가 큰 것으로 형변환을 시켜줘야 했었는데 제출했다가 실패해서 코드 수정하고 다시 제출했습니다!
'Algorithm > - Programmers' 카테고리의 다른 글
[프로그래머스/Kotlin] 나누어 떨어지는 숫자 배열 (0) | 2024.03.05 |
---|---|
[프로그래머스/Kotlin] 서울에서 김서방 찾기 (1) | 2024.02.29 |
[프로그래머스/Kotlin] 두 정수 사이의 합 (0) | 2024.02.27 |
[프로그래머스/Kotlin] 하샤드 수 (1) | 2024.02.23 |
[프로그래머스/Kotlin] 정수 내림차순으로 배치하기 (0) | 2024.02.22 |
주코딩의 개발 노트!
포스팅이 좋았다면 "좋아요❤️" 또는 "구독👍🏻" 해주세요!