이 영역을 누르면 첫 페이지로 이동
쿄코코 블로그의 첫 페이지로 이동

쿄코코

페이지 맨 위로 올라가기

쿄코코

얼레벌레 생활🤯

백준 1309(동물원) - Python(파이썬),Java(자바) - 다이나믹

  • 2022.05.28 02:22
  • [백준] Python,Java로 풀기📖/다이나믹
    반응형
     

    1309번: 동물원

    첫째 줄에 우리의 크기 N(1≤N≤100,000)이 주어진다.

    www.acmicpc.net

    dp[ i ] : i번째에 사자가 있는 경우의 가지 수

    array[ i ] : 2*i 배열에서 사자의 경우의 수

     

    ex ]

    i= 4인 경우 -> 4번째에 사자가 있는 경우의 가지 수를 의미

    ① 3( 4-1 ) 번째에 사자가 있는 경우 ( dp[3] ) -> 밑에 그림고 같이 4번째에 사자의 자리는 무조건 정해질 수 밖에 없다 

      => 경우의 수 :  dp[3] * 1 ( 사자 자리 지정 되므로 ) 

    i=1 i=2 i=3 i=4
         O  
          O
    i=1 i=2 i=3 i=4
          O
        O  

    ② 3번째에 사자가 없는 경우의 수 ( array[ 2] : 2*2 배열에서 사자의 경우의 수를 의미 )

         -> 이 경우에는 3번째에 사자가 없으므로 4번째에 사자의 자리는 어디든 와도 상관이 없다

       => 경우의 수 : array[2] * 2

    i=1 i=2 i=3 i=4
          O
          O

     

    즉, 4번째에 사자가 있는 경우의 수 dp[4] = dp[3]*1 + array[2] *2 

    그리고 2*4 배열의 사자의 총 경우의 수 =. 2*3배열의 사자의 총 경우의 수 + i=4번째에 사자가 올 경우의 수 이므로 

    2*4 배열의 사자의 총 경우의 수 array[4] = array[3] + dp[4] 


    따라서 점화식은

      dp[i] = dp[i-1]*1 + array[i-2]*2( 단, i>= 2인 경우 ) , array[ i ] = array[i-1]+dp[i] ( 단, i>=1인 경우 ) 

      i = 0인 경우 , 사자가 아예 없을 때도 경우의 수라고 하였으므로 dp[0] =1 , array[ 0 ] = 1

      i =1 인 경우 , dp[1] =2, array[1] = array[ 0 ]+dp[1] = 3

    풀이방법
    ① 리스트 개수가 N만큼 dp,array 리스트 선언 
    ② i>1인 경우 dp[ i ] = dp[i-1] *1 + array[i-2]*2 , array[ i ] = array[ i-1 ] + dp[i]
    ③ i = 0인 경우, dp[0] =array[0]=1
         i=1인 경우, dp[1] = 2, array[1]= 3 대입
    ④ 단, 숫자가 매우 커지기 때문에 9901로 나눈 나머지를 구해야하므로 array에 계산할 때 9901의 나머지 값이 들어가야한다.
    즉, 점화식을 array[ i ] = ( array[ i-1 ] + dp[i] ) % 9901 로 변경

    Pytho의 경우 (파이썬) 

    import sys
    N = int(sys.stdin.readline())
    #dp ,array 리스트 선언
    dp=[0]*(N+1)
    #사자를 배치하는 경우의 수
    array=[0]*(N+1)
    
    #n=0인 경우 초기화
    dp[0]=array[0]=1
    if N>0:#n=1인 경우 초기화
        dp[1]=2
        array[1]=3
    if N>1:#n은 2이상의 경우
        for i in range(2,N+1):
            dp[i]=dp[i-1]+array[i-2]*2
            array[i]=(array[i-1]+dp[i])%9901
    
    print(array[N])

    Java의 경우 (자바)

    import java.util.*;
    import java.io.*;
    
    public class Main {
        public static void main(String[] args) throws IOException{
            BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
            int N = Integer.parseInt(br.readLine());
            int[] array= new int[N+1];
            int[] dp = new int[N+1];
            dp[0]=array[0]=1;
            if(N>0){
                dp[1]=2;
                array[1]=3;
            }
            if(N>1){
                for(int i=2;i<N+1;i++){
                    dp[i]=dp[i-1]+array[i-2]*2;
                    array[i]=(array[i-1]+dp[i])%9901;
                }
            }
            System.out.println(array[N]);
        }
    }
    반응형

    '[백준] Python,Java로 풀기📖 > 다이나믹' 카테고리의 다른 글

    백준 2502(떡 먹는 호랑이) - Python(파이썬) - 다이나믹프로그래밍  (0) 2022.05.30
    백준 2293(동전 1) - Python(파이썬) - 다이나믹  (0) 2022.05.29
    백준 18353(병사 배치하기) - Python(파이썬) - LIS,다이나믹  (0) 2022.05.26
    백준 11053( 가장 긴 증가하는 수열 ) - Python(파이썬),Java(자바)- 다이나믹(LIS)  (0) 2022.05.26
    백준 2156(포도주 시식) - 다이나믹 알고리즘  (0) 2022.05.26

    댓글

    이 글 공유하기

    • 구독하기

      구독하기

    • 카카오톡

      카카오톡

    • 라인

      라인

    • 트위터

      트위터

    • Facebook

      Facebook

    • 카카오스토리

      카카오스토리

    • 밴드

      밴드

    • 네이버 블로그

      네이버 블로그

    • Pocket

      Pocket

    • Evernote

      Evernote

    다른 글

    • 백준 2502(떡 먹는 호랑이) - Python(파이썬) - 다이나믹프로그래밍

      백준 2502(떡 먹는 호랑이) - Python(파이썬) - 다이나믹프로그래밍

      2022.05.30
    • 백준 2293(동전 1) - Python(파이썬) - 다이나믹

      백준 2293(동전 1) - Python(파이썬) - 다이나믹

      2022.05.29
    • 백준 18353(병사 배치하기) - Python(파이썬) - LIS,다이나믹

      백준 18353(병사 배치하기) - Python(파이썬) - LIS,다이나믹

      2022.05.26
    • 백준 11053( 가장 긴 증가하는 수열 ) - Python(파이썬),Java(자바)- 다이나믹(LIS)

      백준 11053( 가장 긴 증가하는 수열 ) - Python(파이썬),Java(자바)- 다이나믹(LIS)

      2022.05.26
    다른 글 더 둘러보기

    정보

    쿄코코 블로그의 첫 페이지로 이동

    쿄코코

    • 쿄코코의 첫 페이지로 이동

    검색

    메뉴

    • 홈

    카테고리

    • 분류 전체보기 (168)
      • Python (24)
        • 😈 99클럽 코테 스터디 4기 TIL (23)
        • 궁금한거 정리 (1)
      • SQL (16)
        • HackerRank (15)
      • [백준] Python,Java로 풀기📖 (71)
        • 정렬(Sorting) (6)
        • 그리디 (5)
        • 문자열 (7)
        • 수학 (3)
        • DFS&BFS (10)
        • 구현 (4)
        • 다이나믹 (17)
        • 이분탐색 (1)
        • 자료구조 (10)
        • 최단거리 (5)
        • 인덱스트리 (0)
      • [프로그래머스]Python,Java로 풀기 (6)
        • Level 1 (4)
        • Level 2 (2)
      • Study Platform📚 (25)
        • (운영체제) - 블로그 및 강의 참고 (0)
        • 김영한👨🏻‍🏫의 스프링 부트와 JPA 실무 완전 .. (5)
        • (알고리즘)- [이코테] 이것이 코딩테스트다 정리 (10)
        • 그림으로 배우는 Http&Network Basic (10)
      • 까먹을까봐 적는 것들 (4)
      • 테스트 보고 난 후..🤔 (0)
      • kt 에이블스쿨 (18)

    최근 글

    인기 글

    댓글

    공지사항

    아카이브

    태그

    • 코딩테스트준비
    • 항해99
    • 99클럽
    • 백준
    • TiL
    • 프로그래머스
    • 오블완
    • 티스토리챌린지

    나의 외부 링크

    정보

    쿄코코의 쿄코코

    쿄코코

    쿄코코

    블로그 구독하기

    • 구독하기
    • RSS 피드

    방문자

    • 전체 방문자
    • 오늘
    • 어제

    티스토리

    • 티스토리 홈
    • 이 블로그 관리하기
    • 글쓰기
    Powered by Tistory / Kakao. © 쿄코코. Designed by Fraccino.

    티스토리툴바