ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • BOJ) 1,2,3 더하기
    알고리즘/백준 2020. 6. 29. 15:49
    반응형

    1,2,3 더하기

     

    9095번: 1, 2, 3 더하기

    문제 정수 4를 1, 2, 3의 합으로 나타내는 방법은 총 7가지가 있다. 합을 나타낼 때는 수를 1개 이상 사용해야 한다. 1+1+1+1 1+1+2 1+2+1 2+1+1 2+2 1+3 3+1 정수 n이 주어졌을 때, n을 1, 2, 3의 합으로 나타내는

    www.acmicpc.net

    풀이

     

    브루트 포스 문제로 입력값 n을 1, 2, 3 숫자의 합으로 나타낼 수 있는 경우의 수를 구하는 문제다.

    또한, 순서가 있기 때문에, 1+1+2 와 1+2+1은 다른 것으로 간주한다.

    예전에 풀었던 문제인데, 기억에 남아있지 않아서 새롭게 풀었다.

     

    먼저, 예전에 풀었던 방식은 점화식을 통해서 답을 찾았었다.

    dn = dn-3 + dn-2 + dn-1 이라는 식이 나와서 쉽게 답을 구한 것 같다.

     

    새롭게 푼 방식은, 브루트 포스 문제임을 알고 풀어서 재귀를 이용했다.1~3까지 수를 입력받은 n에서 빼면서 0이하가 됐을 때, 종료하는 메소드를 만들었다.이 때, n이 0이라면 1~3을 더해갈 때, n이 나왔다는 소리기 때문에 count를 증가시켜줬다.

     

    브루트 포스로도 풀 수 있지만, 점화식을 이용해서 푸는 것이 메모리와 속도에 훨씬 효율적이라고 생각한다.

     

    코드 1

     

    import java.io.BufferedReader;
    import java.io.IOException;
    import java.io.InputStreamReader;
    public class Main {
        private static int getResult(int num) {
            if(num ==1) {
                return 1;
            } else if(num ==2) {
                return 2;
            } else if(num ==3) {
                return 4;
            }
            int[] caseNum = new int[11];
            caseNum[0] =0;
            caseNum[1] =1;
            caseNum[2] =2;
            caseNum[3] =4;
            for(int i =4; i<=num; i++) {
                caseNum[i] = caseNum[i-3] + caseNum[i-2] + caseNum[i-1];
            }
            return caseNum[num];
        }
        private static void printCase(int num) {
            System.out.println(getResult(num));
        }
        public static void main(String[] args) throws IOException {
            BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
            int testCase = Integer.parseInt(br.readLine());
            for(int i=0; i<testCase; i++) {
                int num = Integer.parseInt(br.readLine());
                printCase(num);
            }
            br.close();
        }
    }

     

    코드 2

     

    import java.io.BufferedReader;
    import java.io.IOException;
    import java.io.InputStreamReader;
    
    public class Plus123_9095 {
        final static int[] numArr = {1,2,3};
        static int answer;
    
        public static void main(String[] args) throws IOException {
            solution(new BufferedReader(new InputStreamReader(System.in)));
        }
    
        private static void solution(BufferedReader br) throws IOException {
            int testCase = Integer.parseInt(br.readLine());
    
            for(int i=0; i<testCase; i++) {
                answer =0;
                getCount(Integer.parseInt(br.readLine()));
                System.out.println(answer);
            }
        }
    
        private static void getCount(int n) {
            if(n <=0) {
                if(n ==0) {
                    answer++;
                }
                return;
            }
            for(int i=0; i<3; i++) {
                getCount(n-numArr[i]);
            }
        }
    }
    반응형

    '알고리즘 > 백준' 카테고리의 다른 글

    BOJ) 두 동전  (0) 2020.06.29
    BOJ) 이모티콘  (0) 2020.06.29
    BOJ) 로마 숫자 만들기  (0) 2020.06.26
    BOJ) 숨바꼭질  (0) 2020.06.26
    BOJ) 요세푸스 문제  (0) 2020.06.25

    댓글

Designed by Tistory.