본 캠프
최종 프로젝트. (1)
Iruka913
2024. 12. 31. 20:08
신나는 알고리즘 풀이 시간.
문제 설명
효진이는 멀리 뛰기를 연습하고 있습니다. 한 번에 1칸 또는 2칸씩 뛸 수 있는데, 총 nn개의 칸이 주어졌을 때 효진이가 맨 끝 칸에 도달하는 방법은 몇 가지일까요?
예를 들어 n=4n=4일 때, 효진이가 끝에 도달하는 방법은 다음과 같습니다:
- (1칸, 1칸, 1칸, 1칸)
- (1칸, 2칸, 1칸)
- (1칸, 1칸, 2칸)
- (2칸, 1칸, 1칸)
- (2칸, 2칸)
즉, 경우의 수는 5가지입니다.
제한 조건
- nn은 1 이상, 2000 이하의 정수입니다.
- 결과 값이 너무 커질 수 있으므로 1234567로 나눈 나머지를 반환해야 합니다.
문제를 보고 작성한 노트
문제를 풀지 못 한 원인
f(n) = f(n-1) + f(n-2)에서 피보나치 수열을 연상해내지 못 했기 때문.
그걸 연상해냈더라면 풀 수 있었던 문제였는데, 다소 아쉽다.
코드 구현
다음은 효율적인 풀이를 위한 코드다:
function solution(n) {
let a = 1; // f(1)
let b = 2; // f(2)
for (let i = 3; i <= n; i++) {
let temp = (a + b) % 1234567; // 점화식 적용 및 나머지 연산
a = b; // f(n-1)로 갱신
b = temp; // f(n)로 갱신
}
return n === 1 ? a : b; // n이 1이면 a(=1), 아니면 b 반환
}
풀이 과정
- 점화식 f(n)=f(n−1)+f(n−2)f(n) = f(n-1) + f(n-2)를 코드로 구현.
- 계산 중에 12345671234567로 나머지를 구해 숫자가 커지는 걸 방지.
- 배열 대신 변수 두 개만 사용해 메모리를 절약.
테스트 결과
예제 n=4n=4:
- f(4)=f(3)+f(2)=3+2=5f(4) = f(3) + f(2) = 3 + 2 = 5
예제 n=5n=5:
- f(5)=f(4)+f(3)=5+3=8f(5) = f(4) + f(3) = 5 + 3 = 8
모든 계산에서 1234567로 나눈 나머지를 적용해 제한 조건을 만족
마무리
이 문제는 피보나치 수열의 특징을 활용해 동적 계획법(DP)으로 푸는 좋은 예다.
값이 커질수록 효율적인 코드 구현이 중요했고, 나머지 연산을 통해 메모리와 시간 복잡도를 절약할 수 있었다.
이 문제를 풀면서 점화식과 동적 계획법에 대한 이해가 한층 더 깊어졌다.
최종 프로젝트 / 기획
오늘은 최종 프로젝트를 기획하기 위한 회의를 진행하였다.
기획은 다 했지만, 해당 기획을 진행하는 것에 대한 타당성과 근거를 확보하기 위해서, 설문 조사를 진행하였다.
https://docs.google.com/forms/d/e/1FAIpQLScxZA3z_Ups_xpO4tMDlLla3CDclGHX3FpQqNLZbBSttpMkfw/viewform