ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 2. 피보나치 수
    코딩 테스트/Level 2 2019. 11. 8. 23:06
    반응형

    https://programmers.co.kr/learn/courses/30/lessons/12945

     

    저의 블로그에서도 다룬 적 있는 문제입니다. 

    https://comdoc.tistory.com/entry/33-피보나치-수열과-동적-프로그래밍

     

    파이썬

    재귀의 예로 많이 사용됩니다만, 문제의 조건인 100,000은 파이썬의 재귀 한계를 넘겨 버립니다. 

    RecursionError: maximum recursion depth exceeded in comparison

    재귀를 쓰지 말고, 반복문을 사용합니다. 

     

    문제를 그대로 코딩하면 이렇습니다만.. 

    def solution(n):
        f0, f1 = 0, 1
        for i in range(2, n+1):
            f0, f1 = f1, (f1 + f0)
        return f1 % 1234567
        
    """
    테스트 1 〉	통과 (0.05ms, 10.7MB)
    테스트 2 〉	통과 (0.04ms, 10.7MB)
    테스트 3 〉	통과 (0.04ms, 10.8MB)
    테스트 4 〉	통과 (0.04ms, 10.7MB)
    테스트 5 〉	통과 (0.04ms, 10.7MB)
    테스트 6 〉	통과 (0.04ms, 10.7MB)
    테스트 7 〉	통과 (0.14ms, 10.7MB)
    테스트 8 〉	통과 (0.08ms, 10.7MB)
    테스트 9 〉	통과 (0.05ms, 10.7MB)
    테스트 10 〉	통과 (0.15ms, 10.8MB)
    테스트 11 〉	통과 (0.06ms, 10.6MB)
    테스트 12 〉	통과 (0.07ms, 10.8MB)
    테스트 13 〉	통과 (111.05ms, 10.8MB)
    테스트 14 〉	통과 (106.98ms, 10.8MB)
    """

    이렇게 해주는 게 더 좋을 것 같습니다. 

    큰 수에서 더 빠릅니다. 

    def solution(n):
        f0, f1 = 0, 1
        for i in range(2, n+1):
            f0, f1 = f1, (f1 + f0) % 1234567
        return f1
        
    """
    테스트 1 〉	통과 (0.04ms, 10.7MB)
    테스트 2 〉	통과 (0.04ms, 10.7MB)
    테스트 3 〉	통과 (0.04ms, 10.6MB)
    테스트 4 〉	통과 (0.04ms, 10.7MB)
    테스트 5 〉	통과 (0.05ms, 10.6MB)
    테스트 6 〉	통과 (0.05ms, 10.7MB)
    테스트 7 〉	통과 (0.13ms, 10.8MB)
    테스트 8 〉	통과 (0.09ms, 10.7MB)
    테스트 9 〉	통과 (0.06ms, 10.6MB)
    테스트 10 〉	통과 (0.14ms, 10.6MB)
    테스트 11 〉	통과 (0.07ms, 10.7MB)
    테스트 12 〉	통과 (0.08ms, 10.7MB)
    테스트 13 〉	통과 (6.72ms, 10.7MB)
    테스트 14 〉	통과 (6.68ms, 10.7MB)
    """

     

    자바스크립트

    function solution(n) {
        let f0 = 0, f1 = 1
        for (let i = 2; i < n + 1; i++) {
            [f0, f1] = [f1, (f0 + f1) % 1234567]
        }
        return f1
    }

     

    자바

    class Solution {
        public int solution(int n) {
            int fib0 = 0, fib1 = 1, answer = 0;
            for (int i = 2; i <= n; i++) {
                answer = (fib1 + fib0) % 1234567;
                fib0 = fib1;
                fib1 = answer;
            }
            return answer;
        }
    }

     

    코틀린

    코틀린은 한 줄에 여러 변수를 선언할 수가 없습니다. 
    배열을 사용해서 13줄을 11줄로 줄였습니다.

    class Solution {
        fun solution(n: Int): Int {
            var fib = arrayOf(0, 1, 1)
            for (i in 2..n) {
                fib[2] = (fib[1] + fib[0]) % 1234567
                fib[0] = fib[1]
                fib[1] = fib[2]
            }
            return fib[1]
        }
    }

     

    func solution(n int) int {
    	var fib0, fib1 int = 0, 1
        for i := 2; i <= n; i++ {
            fib0, fib1 = fib1, (fib0 + fib1) % 1234567
        }
        return fib1
    }

     

    C#

    public class Solution
    {
        public int solution(int n)
        {
            int[] answer = { 0, 1, 1 };
            for (int i = 2; i <= n; i++)
            {
                answer[2] = (answer[1] + answer[0]) % 1234567;
                answer[0] = answer[1];
                answer[1] = answer[2];
            }
            return answer[2];
        }
    }
    반응형
Designed by Tistory.