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

쿄코코

페이지 맨 위로 올라가기

쿄코코

얼레벌레 생활🤯

백준 1495(기타리스트) - Python(파이썬),Java(자바) - 다이나믹 프로그래밍

  • 2022.06.23 19:12
  • [백준] Python,Java로 풀기📖/다이나믹
    반응형
     

    1495번: 기타리스트

    첫째 줄에 N, S, M이 주어진다. (1 ≤ N ≤ 50, 1 ≤ M ≤ 1,000, 0 ≤ S ≤ M) 둘째 줄에는 각 곡이 시작하기 전에 줄 수 있는 볼륨의 차이가 주어진다. 이 값은 1보다 크거나 같고, M보다 작거나 같다.

    www.acmicpc.net

    예제 풀이

    1) 시작 볼륨(S)= 5일 바꿀 수 있는 볼륨  -> 0 , 10 

    => 5-v[0] = 0 or 5+v[0] = 10

    0 1 2 3 4 5 6 7 8 9 10
    1                   1

    2) 현재 볼륨이 0과 10인 경우 바꿀 수 있는 볼륨 -> 3 , 7

    => 0-v[1] = -3(0보다 작으므로 X) or 0+v[1] = 3 or 10-v[1] = 7 or 10+v[1] = 13(최댓값 10보다 크므로 X)

    0 1 2 3 4 5 6 7 8 9 10
          1       1      

    3) 현재 볼륨이 3과 7인 경우 바꿀 수 있는 볼륨 -> 0, 10

    => 3-v[2] = -4(0보다 작으므로 X) or 3+v[2] = 10 or 7-v[2] = 0 or 7+v[2] = 14(최댓값 10보다 크므로 X) 

    0 1 2 3 4 5 6 7 8 9 10
    1                   1

     

    최종적으로 가장 큰 값이 10이 나온다.

    <dp 테이블>

    0 1 2 3 4 5 6 7 8 9 10
    1                   1
          1       1      
    1                   1

    1) 시작 볼륨(S)= 8일 바꿀 수 있는 볼륨  -> 없음

    => 8-v[0] = -7(0보다 작으므로 X)  or 8+v[0] = 23(20보다 크므로 X)

    2) 마지막 곡을 연주할 수 없으므로 -1을 출력

     

    문제 풀이

    ① dp 테이블 생성 ( 행 : (인덱스가 0부터 n까지) n+1개  | 열 : (0부터 m까지) m+1개 )
      -> 처음 시작 0번째 부터 곡의 개수 (n)까지 하므로 n+1개 , 볼륨은 0부터 m까지 이므로 m+1개 
    ② dp[i][index] 테이블에 값이 1인 경우
      -> index + v[i] <=m : dp의 다음 행인 i+1번의 행에 index +v[i] 열의 값을 1로 변경
      -> index - v[i] >=0 : dp의 다음 행인 i+1번의 행에 index-v[i] 열의 값을 1로 변경
    ③ ②을 i=0부터 n-1까지 실행하여 dp 테이블 변경
    ④ 마지막 행인 n에서는 1이 없는 경우 -1을 출력 , 1이 있을 경우에는 가장 최댓값을 출력

    💻Python(파이썬)

    import sys
    n,s,m = map(int,sys.stdin.readline().split())
    #dp 테이블 생성
    dp = [[0]*(m+1) for _ in range(n+1)]
    #i번째 곡을 연주하기 전에 바꿀 수 있는 볼륨 크기
    v = list(map(int,sys.stdin.readline().split()))
    #처음 시작 볼륨의 값 지정
    dp[0][s]=1
    
    for i in range(n):
        #dp[i]테이블의 인덱스 (index) , dp[i] 테이블의 번호(num)
        for index,num in enumerate(dp[i]):
            #현재 볼륨
            if num==1:
                #다음 볼륨이 0부터 m 사이의 경우 -> 바꿀수 잇는 볼륨
                if index+v[i]<=m:
                    dp[i+1][index+v[i]]=1
                if 0<=index-v[i]:
                    dp[i+1][index-v[i]]=1
    
    #마지막 행에 1이 없는 경우 -> 연주할 수 있는 볼륨이 없음
    if 1 not in dp[n]:
        print(-1)
    #마지막 행에 1이 있는 경우 
    else:
        print(max([i for i,num in enumerate(dp[n]) if num==1 ]))

    💻Java(자바)

    import java.io.*;
    import java.util.*;
    
    public class Main {
        public static void main(String[] args) throws IOException{
            BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
            StringTokenizer st =new StringTokenizer(br.readLine()," ");
            int N = Integer.parseInt(st.nextToken());
            int S = Integer.parseInt(st.nextToken());
            int M = Integer.parseInt(st.nextToken());
            int[][] dp = new int[N+1][M+1];
            st = new StringTokenizer(br.readLine()," ");
            dp[0][S]=1;
            for(int i=0;i<N;i++){
                int a = Integer.parseInt(st.nextToken());
                for(int j=0;j<M+1;j++){
                    if(dp[i][j]==1){
                        if(j+a<=M){
                            dp[i+1][j+a]=1;
                        }
                        if(j-a>=0){
                            dp[i+1][j-a]=1;
                        }
                    }
                }
            }
            int result =-1;
            for(int i = M;i>=0;i--){
                if(dp[N][i]==1){
                    result = i;
                    break;
                }
            }
            System.out.println(result);
        }
    }
    반응형

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

    백준 9095(1,2,3 더하기) - Python(파이썬)  (0) 2022.06.30
    백준 1463(1로 만들기) - Python(파이썬) - 다이나믹  (0) 2022.06.29
    백준 1890(점프) - Python(파이썬) - 다이나믹  (0) 2022.06.20
    백준 20152(Game Addiction) - Python(파이썬) - 다이나믹  (0) 2022.06.06
    백준 14494(다이나믹이 뭐에요?) - Python(파이썬) - 다이나믹  (0) 2022.06.02

    댓글

    이 글 공유하기

    • 구독하기

      구독하기

    • 카카오톡

      카카오톡

    • 라인

      라인

    • 트위터

      트위터

    • Facebook

      Facebook

    • 카카오스토리

      카카오스토리

    • 밴드

      밴드

    • 네이버 블로그

      네이버 블로그

    • Pocket

      Pocket

    • Evernote

      Evernote

    다른 글

    • 백준 9095(1,2,3 더하기) - Python(파이썬)

      백준 9095(1,2,3 더하기) - Python(파이썬)

      2022.06.30
    • 백준 1463(1로 만들기) - Python(파이썬) - 다이나믹

      백준 1463(1로 만들기) - Python(파이썬) - 다이나믹

      2022.06.29
    • 백준 1890(점프) - Python(파이썬) - 다이나믹

      백준 1890(점프) - Python(파이썬) - 다이나믹

      2022.06.20
    • 백준 20152(Game Addiction) - Python(파이썬) - 다이나믹

      백준 20152(Game Addiction) - Python(파이썬) - 다이나믹

      2022.06.06
    다른 글 더 둘러보기

    정보

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

    쿄코코

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

    검색

    메뉴

    • 홈

    카테고리

    • 분류 전체보기 (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)

    최근 글

    인기 글

    댓글

    공지사항

    아카이브

    태그

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

    나의 외부 링크

    정보

    쿄코코의 쿄코코

    쿄코코

    쿄코코

    블로그 구독하기

    • 구독하기
    • RSS 피드

    방문자

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

    티스토리

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

    티스토리툴바