12일차
12일차는 70%까지 풀었다. 매일 꾸준히 하다보니 벌써라는 생각이 자주 든다. 문제를 풀면서 난이도가 조금씩 올라가고 있다고 느껴지기 시작한다. 매일 10%를 채우는 게 목표기는 한데 이후로는 어떻게 될지 잘 모르겠다.

그래도 우선 매일 1시간에서 1시간 30분 정도는 온전히 이 시간에 집중하는 것에 잘하고 있다고 스스로를 칭찬하며 글을 쓴다.
오늘의 문제
콜라츠 수열 만들기
모든 자연수 x에 대해서 현재 값이 x이면 x가 짝수일 때는 2로 나누고, x가 홀수일 때는 3 * x + 1로 바꾸는 계산을 계속해서 반복하면 언젠가는 반드시 x가 1이 되는지 묻는 문제를 콜라츠 문제라고 부릅니다.
그리고 위 과정에서 거쳐간 모든 수를 기록한 수열을 콜라츠 수열이라고 부릅니다.
계산 결과 1,000 보다 작거나 같은 수에 대해서는 전부 언젠가 1에 도달한다는 것이 알려져 있습니다.
임의의 1,000 보다 작거나 같은 양의 정수 n이 주어질 때 초기값이 n인 콜라츠 수열을 return 하는 solution 함수를 완성해 주세요.
입출력 예
| n | result |
|---|
| 10 | [10, 5, 16, 8, 4, 2, 1] |
이 문제를 고른 이유는 재귀함수를 생각해서 골랐다. 재귀함수는 자기 자신을 호출하는 함수를 말하는데, 콜라츠 수열도 그와 비슷한 개념이라 생각했다. 물론 풀이는 재귀함수를 사용해서 풀지는 않았지만, 미리 개념을 대비한다는 마음으로 넣었다.
접근방법
콜라츠 수열의 접근 방법의 핵심은 반복과 조건문이다. 1이 될 때까지 반복해야 되기 때문에 어떤 조건을 잘 넣는 지가 관건인데 그렇게 어렵지 않기 때문에 수월하게 풀 수 있었다.
풀이
function solution(n) {
var answer = [n];
while (n !== 1) {
if (n % 2 === 0) {
n /= 2;
} else {
n = 3 * n + 1;
}
answer.push(n);
}
return answer;
}
while문을 사용하여 n이 1이 아닐 때 까지 반복하고 n이 1일 때 반복문을 끝냈다. 그리고 그 사이에 값을 계속 answer에 넣어주었다. 나중에 재귀함수에서도 마찬가지겠지만, 언제 반복을 끝낼지 타이밍을 확실하게 정해야한다. 이를 아주 쉽게 배운 오늘의 문제다.
정리하기
12일차의 프로그래머스를 마무리하며
오늘 코딩 완료.
라는 말이 떠올랐다. 오코완. 이지만, 나에게는 아직 해야 할 공부들이 많다. 그래도 프로그래머스를 하면서 하루의 코딩을 시작했구나 하는 느낌을 준다. 앞으로의 어려움에 대비하여 계단을 넘을 준비를 해보자.
추가

여태까지 몰랐지는데, 문제를 풀면서 제목만 봤지 밑에 어떤 걸 활용하여 푸는지 눈여겨 보지 않았다. 12일차에는 이걸 봤고, 앞으로 문제를 풀기 전에 힌트를 얻고 푸는 자세를 가져야겠다.