일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | ||||
4 | 5 | 6 | 7 | 8 | 9 | 10 |
11 | 12 | 13 | 14 | 15 | 16 | 17 |
18 | 19 | 20 | 21 | 22 | 23 | 24 |
25 | 26 | 27 | 28 | 29 | 30 | 31 |
Tags
- dp
- Kotlin
- bronze3
- LIS
- 임시저장하기
- bronze2
- stack
- Alert Dialog
- 테마변경
- gradle설정
- 백준
- RecyclerView
- 다크모드제한
- bronze4
- 뷰클래스
- silver4
- bottom-up
- RETROFIT
- toLong()
- 녹음기
- 프로그래머스
- map
- Top-Down
- Silver5
- Android
- naver open api
- LV1
- fragment에서 context사용
- recyclerView 클릭이벤트
- silver3
Archives
- Today
- Total
유니 코드
[PGS/프로그래머스][Lv1] 콜라츠추측(Kotlin) 본문
[문제]
1937년 Collatz란 사람에 의해 제기된 이 추측은, 주어진 수가 1이 될때까지 다음 작업을 반복하면, 모든 수를 1로 만들 수 있다는 추측입니다. 작업은 다음과 같습니다.
1-1. 입력된 수가 짝수라면 2로 나눕니다.
1-2. 입력된 수가 홀수라면 3을 곱하고 1을 더합니다.
2. 결과로 나온 수에 같은 작업을 1이 될 때까지 반복합니다.
예를 들어, 입력된 수가 6이라면 6→3→10→5→16→8→4→2→1 이 되어 총 8번 만에 1이 됩니다. 위 작업을 몇 번이나 반복해야하는지 반환하는 함수, solution을 완성해 주세요. 단, 작업을 500번을 반복해도 1이 되지 않는다면 –1을 반환해 주세요.
[제안 사항]
- 입력된 수, num은 1 이상 8000000 미만인 정수입니다.
[입출력 예]
n | result |
6 | 8 |
16 | 44 |
626331 | -1 |
[풀이]
문제를 읽고 문제 설명대로만 구현하면 바로 끝날 것 같았다.
1) while문 이용해서 1이되면 멈추도록 함
2) answer이 500이 되면 반복문 멈추고 -1 반환
코드를 다 짜고 실행을 시켰는데 자꾸 마지막 케이스에서 실패가 떴다. 문제대로 했는데 실패를 해서 print문을 이용해 input값을 확인해봤더니 중간에 오버플로우가 발생해서 계속 실패했던 것이었다...
* Int 범위는 -2³¹ ~ 2³¹-1(-2147483648 ~ 2147483647)라서 1069967879에 3을 곱하면 오버플로우가 발생한다.
3) toLong()을 이용하여 값의 자료형 변경
코드를 수정해주니 맞았다 :D
[코드]
class Solution {
fun solution(num: Int): Int {
var answer = 0
var input = num.toLong()
while(input != 1L){
if(input % 2 == 0L) {
input /= 2
} else{
input = (input * 3) + 1
}
answer++
println("$answer $input")
if(answer > 500) return -1
}
return answer
}
}
'알고리즘 > 미분류' 카테고리의 다른 글
[PGS/프로그래머스][Lv1] 3진법 뒤집기(Kotlin) (0) | 2022.05.09 |
---|---|
[PGS/프로그래머스][Lv1] 정렬 : K번째수(Kotlin) (0) | 2022.05.08 |
[BOJ/백준][Bronze II] 10820: 문자열 분석 (Kotlin) (0) | 2022.03.02 |
[BOJ/백준][Bronze II] 2577: 숫자의 개수 (Kotlin) (0) | 2022.02.25 |
Comments