[프로그래머스] 콜라츠 추측

lisoh·2022년 3월 11일
0
post-thumbnail

문제

문제 설명

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 미만인 정수입니다.

풀이 과정

//1.입력된 수가 짝수인지 홀수인지 알고싶다.
//2.짝수라면 2n
//3.홀수라면 3n+1
//4.알고싶은 건 계산의 횟수

class Solution {
    public int solution(double num) {
        int count = 0;
        
        
        while(num != 1) {
            if(count == 500){
                return -1;
            }
            count += 1; 
            if(num % 2 == 0){ 
                num =  num / 2; 
            } else{
                num = (num*3)+1;
            } 
        }
        return count;
    }
}
// 삽질 1.

class Solution {
    public int solution(int num) {
        //횟수의 초기값은 0
        int repeat = 0;
        switch (repeat) {
            case 1:  Math.floor(num/2) = 0;
                     repeat++;
                     break;
            case 2:  Math.floor(num/2) = 1;
                     num = (num*3) + 1;
                     repeat++;  
            case 3:  Math.floor(num/2) = -1;
                     repeat++;
                     break;
        }
        System.out.println(repeat);
    }
}
// 삽질 2. ><

class Solution {
    public int solution(int num) {
        // 횟수의 초기값은 0
        int repeat = 0;
				// double temp = num;
        // num 을 temp로 바꿔야..

        while (num != 0 || num != -1) {
					repeat++; // 이게 여기에 둔다고 생각하면 if문을 바꿀 수 있겟져?
	        if(num % 2 == 0){ //이거 %으로 해야하지 않을까요? < 맞아여
						// 추가
						// num = num / 2 이거 빠져있어요.
            repeat++;
	        } else if(num % 2 == 1) {
            num = (num * 3) + 1;
	        } // 모든 if문에 repeat++이 있는데 밖으로 빼면 한줄로 적을 수 있을거같아요 ㅎㅎ
					else if (repeat == 500) {
						return -1;
      }
      return repeat;
    }
}
// 삽질 3. :>
class Solution {
    public int solution(double num) {
        // 횟수의 초기값은 0
        int repeat = 0;
        while (num != 1) {
					repeat++; // 이게 여기에 둔다고 생각하면 if문을 바꿀 수 있겟져?
					if(num % 2 == 0 ) {
						num = num / 2 
          return repeat; // 이 부분 있으면 반복이 안되지 않나용
	        if (num % 2 == 1) {
            num = (num * 3) + 1;
	        } else if (repeat == 500) { 
					  return -1;
          }
        }
        return repeat;
    }
}
//이불님과 은혜로운 라이브 쉐어 강의 풀이 4.

class Solution {
    public int solution(double num) {
        int count = 0;
        
        
        while(num != 1) {
            if(count == 500){
                return -1;
            }
            count += 1; 
            if(num % 2 == 0){ 
                num = num / 2; 
            } else {
                num = (num*3)+1;
            } 
        }
        return count;
        
        // 반복 (결과가 1이 될때까지)
            // 만약 반복 횟수가 500이 넘으면 -1을 리턴한다. 
            // 만약 num이 짝수면 
                // 2로 나눈다.
            // 만약 홀수라면
                // 3을 곱하고 1을 더한다.1을
    }
}

정답 코드

class Solution {
    public int solution(int num) {
        int answer = 0;
        double temp = num;
        
        while(temp != 1) {
            answer += 1;
            
            if(answer >= 500) return -1;
            
            if(temp % 2 == 0) {
                temp /= 2;
            } else {
                temp = (temp * 3) + 1;
            }
        
        }
        return answer;
    }
}
profile
프론트엔드 개발자를 꿈꾸는 개발초보 호랑이

0개의 댓글