본문 바로가기
실천하기/코딩테스트

[220108] Lv.1 / 콜라츠 추측

by 한코코 2022. 1. 9.

문제 사이트 링크 : https://programmers.co.kr/learn/courses/30/lessons/12943

 

코딩테스트 연습 - 콜라츠 추측

1937년 Collatz란 사람에 의해 제기된 이 추측은, 주어진 수가 1이 될때까지 다음 작업을 반복하면, 모든 수를 1로 만들 수 있다는 추측입니다. 작업은 다음과 같습니다. 1-1. 입력된 수가 짝수라면 2

programmers.co.kr

 


내 풀이

let sum=0;

do{
	if(num==1){break;}
    //만약 num이 1이면 do문을 빠져나간다
	else{
		num=((num%2)==0)?Math.floor(num/2):((num*3)+1);
        //조건이 짝수일때 --> 참이면 2로 나눔, 거짓이면 3을 곱하고 1을 더함
		sum++;
        //do문을 돌린 횟수
	}
}while(num!=1)
//언제까지? num이 1이 아닐때까지

answer=(sum>=500)?(answer=-1):(answer=sum);
//sum이 500을 넘어가면 -1을 반환하고 아니면 sum을 반환한다

return answer;
}

do while문을 짤때까지는 짧고 간략하게 썼다! 라고 생각했는데 num이 1일 경우랑 sum이 500을 넘을 경우를 작성하다보니 코드가 길어졌다. 뭔가 정리하고 싶은데 방법을 모르겠다.

 


다른 사람의 풀이 보기 : 삼항연산자로 풀기

function solution(num, count){
	return num==1?(count>=500?-1:count):solution(num%2==0?num/2:num*3+1,++count);
    }

 

조건 num==1  
'참'일 경우 (count>=500?-1:count) 조건 count>=500
'참'일 경우 -1
'거짓일 경우 count
'거짓'일 경우 solution(num%2==0?num/2:num*3+1,++count); 조건 num%2==0
'참'인 경우 num/2
'거짓'일 경우 num*3+1,++count

 

다른 사람의 풀이 보기 : while로 풀기

function solution(num){
	let answer=0;
    while(num!=1 && answer!=500){
    	num = (num%2==0 ? num/2 : (num*3)+1);
        answer++;
     }
     return num==1? answer:-1;
 }
 
 console.log(solution(6))

do while말고 while만으로도 풀 수가 있구나 오우 세상에. 그럼 do while이랑 뭐가 다른걸까.

댓글