콜라스 추측

SaGo_MunGcci·2022년 7월 15일
0
  • 문제
  • 입출력 설명

요약: 아..... 프로그래머스 측정 서버가 이상한것 같다.

문제 접근

  • 문제에 500번을 반복해야 된다는 지문을 보고 while문을 사용해야 되겠다고 생각했다. 그렇게 로직을 생각하면서 작성해보았다.
public class Q27 {

    public int solutionQ27(int num) {
    	// 카운팅 변수를 answer로 선언
        int answer = 0;
   		
        // 1이 아닐때까지 반복문
        // 1이면 while문을 돌지 못하고 바로 answer = 0반환 
        // 문제와 일치
        while(num != 1){
			// 500번을 반복할때까지 1이 되지 않으면 -1을 반환
            if(answer>=500){
                return -1;
            }
			// num 이 짝수 일때
            if(num%2==0){
                num/=2;
                
				// answer에 1더하기
                answer++;
                
			// num 이 홀수 일때
            }else{
                num=(num*3)+1;
                
				// answer에 1더하기
                answer++;
            }
            
      <--num의 결과가 1이 아니면 이곳으로 빠져나감
        }
        
        
        return answer;    
    
    }
}
  • 부푼기대를 안고 결과를 기다렸는데.......

  • 처음 내가 실수했다고 생각했다. 인텔리제이에서도 626331을 입력하고 실행하니까 488이 출력되었다. 그래서 문법이 틀리지는 않았는지, 로직이나, 알고리즘을 잘 못이해했는지 다시 또 다시 생각해보았다.

  • 너무 답답한 나머지 예제를 찾아 보았다.


    public int solutionQ27(int num) {
    
            while (true) {
            if (num == 1){               
                break;
            }

            if (num % 2 == 0) {
                num /= 2;
            } else {
                num = (num * 3) + 1;
            }

            answer++;
            if (answer >= 500){
                return -1;
            }
        }

      return answer;


    }
}
        
        
  • 문제 재접근

  • 내가 이해할 수 있고 내가 작성했던 로직과 비슷한 프로그래머스 통과예제가 있어서 살펴 보았다. while(true)로 무한 반복을 실행하고 내부적으로 num값을 반복 실행하고 1이되면 중지되어 카운팅 변수를 반환하게 된다.
    이 로직에서 초기값이 1이 들어와도 바로 break되어 카운팅 되지 않고 0이 되니까 나의 로직과 알고리즘 이해도 거의 동일했다. 다만 이때 내가 걸렸던 것은 내가 while(true)문을 안쓰고 num != 1로 직관적으로 사용했다는 것이다.

  • 그래서 예제를 실행해보았다.

  • ??????????????????????????????????

  • 1시간 넘게 내가 뭘 잘못 넘겼는지 생각하고 메모장에 일일이 콜라스 추측을 기록한것 같다. 그러다가 문득 예제를 인텔리제이에서 실행해봐야 겠다는 강한생각이 들었다. 그래서 인텔리제이에서 실행해서 626331을 입력하니 무슨 운명의 조화인지 488이 출력되었다.

  • 488이 488번 실행됬다는 뜻이니까 만약 400번 이상이면 콜라스추측이 통과되지 않을까 싶었다. 그래서 500을 400으로 바꾸니까......

  • 통과되는것이었다???????????????????????????????

  • 로직과 알고리즘의 이해가 중요한 문제였던건 확실한데 이 콜라스 추측을 풀면서 느낀점이 문제를 입체적으로 봐야 된다는 점이었다. 만약 내가 코드 하나 한줄을 자세히 살펴보지 않았다면 그냥 다른 통과예제를 찾아서 통과했을것이다. 그러나 끝까지 로직을 생각하고 콜라스 추측의 알고리즘을 이해하면서 문제를 입체적으로 보니 500이라는 숫자가 보이고 이것을 통해 그래도 통과할 수 있었다.

  • 참 오늘 이모저모 신기한 하루였다.

profile
이리저리 생각만 많은 사고뭉치입니다.

0개의 댓글