일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
- 알고리즘
- 백준
- parseInt
- 2진수
- 온프레미스
- level1
- IaaS
- 리스트
- 홀수
- valueof
- INT
- Python
- 11004
- java
- 11652
- 데이터타입
- IntelliJ
- algorithm
- 프로그래머스
- 문자열 숫자 변환
- 짝수
- aws
- 최대공배수
- 유클리드 호제법
- 프로젝트 생성
- 최대공약수
- PaaS
- SaaS
- 자료형
- 웹 서버
- Today
- Total
Ga0Lee
[알고리즘] 프로그래머스(Level1) - 콜라츠 추측(Java)/int형 오버플로우 본문
https://programmers.co.kr/learn/courses/30/lessons/12943
코딩테스트 연습 - 콜라츠 추측
1937년 Collatz란 사람에 의해 제기된 이 추측은, 주어진 수가 1이 될때까지 다음 작업을 반복하면, 모든 수를 1로 만들 수 있다는 추측입니다. 작업은 다음과 같습니다. 1-1. 입력된 수가 짝수라면 2
programmers.co.kr
문제 설명
1937년 Colllatz란 사람에 의해 제기된 이 추측은, 주어진 수가 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 | 4 |
626331 | -1 |
입출력 예 설명
입출력 예 #1
문제의 설명과 같습니다.
입출력 예 #2
16->8->4->2->1 이 되어 총 4번만에 1이 됩니다.
입출력 예 #2
626331은 500번을 시도해도 1이 되지 못하므로 -1을 리턴해야 합니다.
처음에 푼 코드(틀린 솔루션)
class Solution {
public int solution(int num) {
int answer = 0;
while(num > 1){
if(answer > 500) break;
if(num%2 == 0) num /= 2;
else num = (num*3) + 1;
answer++;
}
if(answer > 500) return -1;
return answer;
}
}
num에 대한 연산 결과가 계속 양수일 것이라고 생각해서 num > 1을 반복문 조건으로 하여 코드를 실행했다.
실행 결과
answer의 값이 500이상이어야 하는데 104에서 멈췄다.
이것은 n의 값에 문제가 있다는 뜻이다.
그래서 반복문이 실행될 때마다 변화하는 num의 값을 출력하여 살펴보았다.
변화하는 num 값 살펴보기 위해 수정한 솔루션
class Solution5{
public int solution(int num) {
int answer = 0;
while(num > 1)
{
if(num%2 == 0) num /= 2;
else num = num * 3 + 1;
answer++;
//num값을 확인하기 위한 출력문 추가
System.out.printf("%d번째 num의 값 : %d\n", answer, num);
if(answer > 500) {
return -1;
}
}
return answer;
}
}
실행 결과
104번째 연산에서 num의 값이 음수로 변했다!!
num이 음수이기 때문에 num > 1 조건에 위배되어 반복문이 멈추고 answer = 104라는 결과값을 리턴하게 된 것이다.
num의 값이 음수로 변한 이유는?
바로 오버플로우가 났기 때문이다.
int형은 -2147483648 ~ 2147483647 사이의 값만 저장 가능하다.
그러므로 num을 더 큰 범위의 값을 저장할 수 있는 long형으로 데이터 타입을 변환시킨다.
int와 long의 차이점에 대해 제가 간단히 적은 글이 있으니 더 자세한 내용은 아래 글을 참고하시길 바랍니다.
[Java] 데이터 타입(자료형) - int와 long의 차이점
Ga0Lee [Java] 데이터 타입(자료형) - int와 long의 차이점 본문 Java [Java] 데이터 타입(자료형) - int와 long의 차이점 가영리 2022. 6. 6. 01:08 Prev 1 2 3 4 5 6 ··· 30 Next
ga0lee.tistory.com
최종 솔루션
class Solution5{
public int solution(int num) {
int answer = 0;
long n = num;
while(n > 1)
{
if(n%2 == 0) n /= 2;
else n = n * 3 + 1;
answer++;
if(answer > 500) {
return -1;
}
}
return answer;
}
}
실행 코드
class Solution5{
public int solution(int num) {
int answer = 0;
long n = num;
while(n > 1)
{
if(n%2 == 0) n /= 2;
else n = n * 3 + 1;
answer++;
if(answer > 500) {
return -1;
}
}
return answer;
}
}
public class Main {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
int num = sc.nextInt();
Solution5 sol = new Solution5();
int answer = sol.solution(num);
System.out.println(answer);
}
}
'Algorithm' 카테고리의 다른 글
[알고리즘] 프로그래머스(Level1) - 핸드폰 번호 가리기(Java) (0) | 2022.06.09 |
---|---|
[알고리즘] 프로그래머스(Level1) - 행렬의 덧셈(Java) (0) | 2022.06.08 |
[알고리즘] 프로그래머스(Level1) - x만큼 간격이 있는 n개의 숫자(Java) (0) | 2022.06.06 |
[알고리즘] 프로그래머스(Level 1) - 직사각형 별찍기(Java) (0) | 2022.06.05 |
[알고리즘] 접미사 배열 백준 11656 (Python) (0) | 2022.01.17 |