개발
[백준] 2193 - 이친수

문제 탐색하기
1) 문제 분석
자연수 N (1 ≤ N ≤ 90)이 주어짐
조건을 만족하는 N자리 이친수의 개수를 출력
이친수의 조건
0으로 시작하지 않음
1이 두 번 연속으로 나타나지 않음
즉, 가능한 이진수들 중에서 위 조건을 만족하는 N자리 수의 개수를 구하는 문제
2) 가능한 시간복잡도
(1) 입력 처리
입력 크기: 단일 정수 N
→ O(1)
(2) DP 테이블 구성
dp[i]: i자리 이친수의 개수
최대 90자리까지이므로 → O(N)
(3) 전체 시간복잡도
입력 처리: O(1)
DP 계산: O(N)
→ 총합: O(N)
3) 알고리즘 선택 이유
이 문제는 피보나치 수열과 같은 점화식을 갖는 문제로, 이전 상태를 기반으로 다음 상태를 계산하는 전형적인 동적 프로그래밍(DP) 문제이다.
dp[n] = dp[n - 1] + dp[n - 2]
이와 같은 점화식이 나온 이유
n자리 이친수는 다음 두 가지 경우로 나뉨
마지막 자리가 0인 경우 → 이전에 0 또는 1이 올 수 있음
마지막 자리가 1인 경우 → 이전은 무조건 0이 와야 함
→ 이 점화식을 통해 불필요한 중복 계산 없이 정답을 구할 수 있음
코드 설계하기
1. 실행 구조
1) 입력 처리
입력값: N (자리 수)
2) DP 테이블 초기화
dp[1] = 1
dp[2] = 1 (단, 입력이 2 이상일 때만 할당)
3) 점화식 기반 DP 계산
dp[i] = dp[i - 1] + dp[i - 2]
3부터 N까지 반복
4) 정답 출력
console.log(dp[N])
2. 고민이 되었던 부분
1) 입력 처리에서의 에러 대응
: dp[2]를 무조건 할당할 경우, 입력이 1일 때 존재하지 않는 배열 접근이 발생할 수 있음
→ if (N >= 2) 조건으로 안전하게 처리
2) 2차원 DP 대신 1차원 DP 선택
dp[i][0], dp[i][1] 등 이차원 배열도 가능하지만,
단순히 개수만을 세면 되기 때문에 1차원 배열로 충분함
→ 점화식 기반으로 더 간결하고 오류 가능성이 적음
정답 코드
// 사용 언어 : Javascript
const fs = require('fs');
const input = fs.readFileSync(0, 'utf-8').trim();
const N = Number(input);
const dp = new Array(N + 1).fill(0);
dp[1] = 1;
if (N >= 2) dp[2] = 1;
for (let i = 3; i <= N; i++) {
dp[i] = dp[i - 1] + dp[i - 2];
}
console.log(dp[N]);마무리하며
어제 개인적인 일정으로 인해 문제를 못 풀었기에, 오늘은 꼭 문제를 풀어야겠다며 초심의 마음을 다시 가졌다. 이번 문제는 단순한 수열 문제처럼 보이지만, “이진수의 성질”과 “DP 점화식 유도”가 정확히 연결되어야 하는 문제였다.
특히 초기값 설정, 불필요한 계산 제거, 입력 예외 처리 등 작지만 중요한 디테일을 신경 쓰지 않으면 ‘틀렸습니다’가 발생할 수 있기에, 단순 구현보다는 “문제 조건을 수학적으로 해석해 점화식을 세우는 능력”이 요구됐다고 느꼈다 .앞으로도 문제를 풀 때 단순히 구현만 하지 않고, 조건의 수학적 구조와 해법을 논리적으로 정리하는 습관을 유지하고 싶다.