프로그래머스 LV1 "콜라츠 추측"
프로그래머스 Lv1 콜라츠 추측
기초부터 다시 공부를 하기위해 프로그래머스 라는 사이트에서 코딩테스트를 LV0 부터 가능한곳까지 못하는곳은 레퍼런스를 찾아가며 풀어보려고 합니다.
매일 1개의 풀이를 하고 그 풀이에대한 나의 생각 및 해석을 적어보려합니다.
오늘은 LV1 열아홉번째 문제 ‘콜라츠 추측’ 문제입니다.
위 이미지가 프로그래머스 코딩문제입니다.
문제는 매개변수로 자연수 num
를 입력받아 num
이 짝수면 2로 나누고 홀수면 3을 곱한뒤 1을 더하는 작업을 정해진 횟수만큼 반복해 그안에 1이 된다면 반복 횟수를, 1이 안되었다면 -1을 출력하는 문제입니다.
오늘 문제에서는 ‘삼항연산자’으로 문제를 해결해 보겠습니다.
그럼 오늘의 문제를 한번 풀어보겠습니다.
기본 세팅 코드도 알아보겠습니다.
1
2
3
4
function solution(num) {
var answer = 0;
return answer;
}
기본 세팅 코드는 매개변수 num
은 정수가 입력되고 함수 안에는 answer
이라는 변수가 선언되어 0을 리턴하는 간단한 기본 세팅 코드입니다.
우선 문제를 알가보기 전에 ‘콜라츠 추측’이 무엇인지 한번 간단하게 알아보고 문제를 해결해 보겠습니다. 이전 포스팅의 ‘하샤드 수’와 마찬가지로 이번 포스팅을 하면서 처음 알게되었습니다.
콜라츠 추측(Collatz Conjecture)
콜라츠 추측(Collatz Conjecture)은 수학에서 아직 증명되지 않은 문제 중 하나로, 간단한 형태로 나타낼 수 있지만 여전히 해결되지 않은 문제 중 하나입니다. 이 추측은 1937년에 독일 수학자 로이트벡(Julius Wilhelm Richard Dedekind)에 의해 처음으로 제시되었습니다.
콜라츠 추측은 다음과 같습니다. 양의 정수 n을 시작으로 하는 시퀀스를 생성하는데, 이 시퀀스는 다음의 규칙에 따라 정의됩니다:
- n이 짝수인 경우, n을 2로 나눕니다.
- n이 홀수인 경우, n에 3을 곱한 뒤 1을 더합니다.
이 과정을 반복하면서 계속해서 새로운 수를 만들어나갑니다. 이 과정을 통해 생성된 수열은 결국에는 1에 도달할 것이라는 추측입니다. 즉, 어떤 수 n으로 시작하더라도 위의 규칙을 적용하여 계산한 후, 마침내 1에 도달하게 될 것이라는 것입니다.
예를 들어, n = 6으로 시작한다고 가정해 봅시다.
- 6은 짝수이므로 2로 나누면 3이 됩니다.
- 3은 홀수이므로 3을 곱하고 1을 더하면 10이 됩니다.
- 10은 짝수이므로 2로 나누면 5가 됩니다.
- 5는 홀수이므로 3을 곱하고 1을 더하면 16이 됩니다.
- 16은 짝수이므로 2로 나누면 8이 됩니다.
- 8은 짝수이므로 2로 나누면 4가 됩니다.
- 4는 짝수이므로 2로 나누면 2가 됩니다.
- 2는 짝수이므로 2로 나누면 1이 됩니다.
따라서 이 과정을 거쳐 1에 도달하게 됩니다. 콜라츠 추측은 모든 양의 정수 n에 대해 위의 과정을 통해 마침내 1에 도달한다는 것을 주장합니다. 그러나 이 추측은 아직 증명되지 않았으며, 현재까지도 해결되지 않은 문제 중 하나로 남아 있습니다.
이렇게 콜라츠 추측이 무엇인지 알아보았습니다. 이번 수학도 흥미롭군요… 저는 처음들어본 수 입니다ㅎㅎ 여러분은 어떠신지 이번에도 댓글로 말씀해주세요.
그리고 한가지 더, 위에서 말했던 삼항 연산자에 대해서 한번 짧게 알아보고 문제를 풀어보겠습니다.
삼항 연산자
삼항 연산자는 조건부 연산자로, 조건에 따라 다른 값을 반환하도록 도와줍니다. 기본적인 구문은 다음과 같습니다:
1
condition ? exprIfTrue : exprIfFalse
여기서 condition
은 평가할 조건을 나타내며, exprIfTrue
는 조건이 참일 때 반환할 값이고, exprIfFalse
는 조건이 거짓일 때 반환할 값입니다.
예를 들어, 다음은 삼항 연산자를 사용하여 간단한 예제를 표현한 것입니다:
1
2
3
var age = 20;
var status = (age >= 18) ? '성인' : '미성년자';
console.log(status); // 출력 결과: '성인'
위 예제에서는 age
가 18 이상인 경우에는 ‘성인’을 반환하고, 그렇지 않은 경우에는 ‘미성년자’를 반환합니다.
삼항 연산자는 조건문을 짧고 간결하게 작성할 수 있도록 도와줍니다. 하지만 과용되면 코드의 가독성을 해칠 수 있으므로 적절하게 사용해야 합니다.
그럼 삼항 연산자로 num
의 나머지 수가 0이면 짝수이니 나누기 2를, 0이 아니면 3을 곱한뒤 1을 더해주는 식을 써보겠습니다.
1
num = num%2 == 0? num / 2 : num * 3 + 1;
그럼 이 삼항 연산자를 이용해 문제를 완성해 보겠습니다.
1
2
3
4
5
6
7
8
9
10
11
function solution(num) {
var answer = 0;
for (let i = 0; i < 500; i++){
if(num != 1){
num = num%2 == 0? num / 2 : num * 3 + 1;
} else{
return answer = i;
}
}
return answer = -1;
}
문제의 식이 완성되었으니 프로그래머스에 한번 확인해보겠습니다.
성공이네요!
오늘은 프로그래머스 LV1 ‘콜라츠 추측’ 문제의 대해서 알아봤습니다.
제 방법이 꼭 정답은 아니니 그저 이런방법도 있구나하고 참고용으로만 봐주시면 감사하겠습니다.
감사합니다.