<2.4> 피보나치 수열

mutexlocking·2022년 7월 16일
0

문제
: 사용자로부터 N값을 입력받아 , 1번째 항부터 N번째 항까지의 피보나치 수열값을 모두 출력
(단 1번째 항은 1이라고 가정, 이때 N 은 3이상 45이하의 자연수)
EX) 3을 입력받으면 -> 1 1 2 를 출력해야 함
EX) 5를 입력받으면 -> 1 1 2 3 5 를 출력해야 함
EX) 10을 입력받으면 -> 1 1 2 3 5 8 13 21 34 55

이 문제의 요구사항은 곧 N번째 항까자의 피보나치 수열 값을 출력하는 것이다.
따라서 우리가 알고있는 "이전항 + 이전이전항" = "다음항" 이 되는 피보나치 수열의 논리를 코드로 풀어내면 문제를 쉽게 해결할 수 있다.

[해결책]
1. Array섹션인 만큼 배열을 사용
: arr[0] 에 0 을 , arr[1]에 1을 미리 대입해둔 뒤, 반복문을 돌면서
arr[i]=arr[i-2]+arr[i-1] 연산을 하여 피보나치 수열 값을 구할 수 있다.

  1. 배열을 사용하지 않고
    : 3개의 변수 a1, a2, a3를 선언한 후, a1=0, a2=1을 대입한 후, 반복문을 돌면서 <a3=a1+a2; (a3출력) a1=a2; a2=a3;> 의 과정을 반복하면 된다.

위 두 해결책을 각각 solution(), solution2() 메서드로 구현한 코드를 아래에서 확인할 수 있다.

import java.util.Scanner;

public class Main {

    public static void solution(int N){
        int[] fibo = new int[N+1];

        fibo[0] = 0;
        fibo[1] = 1;

        for(int i=2; i<=N; i++){
            fibo[i] = fibo[i-1] + fibo[i-2];
        }

        for(int i=1; i<=N; i++){
            System.out.print(fibo[i] + " ");
        }

    }

    public static void solution2(int N){
        int a1 = 0;
        int a2 = 1;
        int a3 = a1+a2;

        System.out.print(a2 + " ");
        for(int i=2; i<=N; i++){
            System.out.print(a3 + " ");
            a1 = a2;
            a2 = a3;
            a3 = a1 + a2;
        }
    }


    public static void main(String[] args) {

        //0. Scanner 준비
        Scanner sc = new Scanner(System.in);

        //1. n번째 항인지, n을 입력
        int N = sc.nextInt();

        //2. 그 n을 인자로 넘기면서 solution()을 호출하여 , 결과 피보나치 수열을 출력
        solution2(N);
    }
}

참고로 피보나치 수열은 재귀함수를 통해서도 해결할 수 있는걸로 기억하지만 ,
이는 이미 계산한 값임에도 불구하고 함수를 다시 호출해서 계산해야 하는 비효율적인 측면이 있기 때문에 , 재귀함수를 이용해서 문제를 해결하지는 않았다.

profile
개발자가 되고자 try 하는중

0개의 댓글