코테 스터디를 끝낸 후, 코테 관련 블로그는 잘 안올릴려 했으나
이 문제는 꼭 블로그에 포스팅하여 한 번 더 정리하고 넘어가야겠다는 생각이 들어
오랜만에 코테 관련 블로그를 끄적여봅니다😖😖
프로그래머스 피보나치 수 2단계 문제입니다
https://school.programmers.co.kr/learn/courses/30/lessons/12945
프로그래머스
코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.
programmers.co.kr
❓문제설명
피보나치 수는 F(0) = 0, F(1) = 1일 때, 1 이상의 n에 대하여 F(n) = F(n+1) + F(n-2) 가 적용되는 수 입니다.
예를 들어
F(2) = F(0) + F(1) = 0 + 1 = 1
F(3) = F(1) + F(2) = 1 + 1 = 2
F(4) = F(2) + F(3) = 1 + 2 = 3
F(5) = F(3) + F(4) = 2 + 3 = 5
와 같이 이어집니다.
2 이상의 n이 입력되었을 때, n번째 피보나치 수를 1234567으로 나눈 나머지를 리턴하는 함수, solution을 완성해 주세요.
⚠️ 제한사항 및 입출력 예
- n은 2 이상 100,000 이하인 자연수입니다.
n | return |
3 | 2 |
5 | 5 |
✏️ 나의 풀이
피보나치 수는 워낙 유명하며, 수업시간때도 몇번 다뤄본 문제이기에 제귀함수를 써서 가볍게 풀어냈다
class Solution {
public int solution(int n) {
if(n <= 1)
return n;
else
return solution(n-1) + solution(n-2);
}
}
이게 내가 처음 푼 풀이인데, 답은 맞았지만 시간초과가 나버렸다.
하지만 난 제귀함수로 푸는 방법 밖에 몰랐기에 매우 혼란스러웠다.
그 와중, 어떤 분이 잘 써주신 글을 보게 되었다.
위 글을 보고 머리를 한 대 띵 맞은 느낌이였다. 세상에 천재분들은 많구나...
또, 여태까지 메모리 신경을 잘 안쓰며 개발했던 나날들이 후회하게 되었다.
class Solution {
public int solution(int n) {
int answer[] = new int[n+1];
for(int i=0; i<=n; i++){
if(i == 0) answer[i] = 0;
else if(i == 1) answer[i] = 1;
else {
int sum = answer[i-2] + answer[i-1];
answer[i] = sum % 1234567;
}
}
return answer[n];
}
}
그래서 위와 같이 코드를 새로 짰다. 이번엔 당연히 통과!!!
위 코드를 간단히 설명해보자면,
- n보다 하나 더 큰 배열을 생성해주고
- 피보나치 수 0과 1의 값은 0과 1이니 예외처리 해주었다.
- 그리고 배열 index 특징을 살려서 f(n-1) + f(n-2)한 값을 sum이라는 변수에 담아주었다.
- answer[i]에는 sum % 1234567 값을 넣어 메모리 초과가 안되게 해주었다.
'CodingTest' 카테고리의 다른 글
프로그래머스 - 서울에서 김서방 찾기 (0) | 2023.07.12 |
---|---|
프로그래머스 - 자릿수 더하기 (JAVA) (0) | 2023.06.10 |
프로그래머스 - A 강조하기 (JAVA) (0) | 2023.05.02 |
프로그래머스 - 대문자와 소문자 (JAVA) (0) | 2023.04.10 |
프로그래머스 - 피자 나눠 먹기 (2) (JAVA) (0) | 2023.04.07 |