본문 바로가기
알고리즘

백준 알고리즘 공부 9465번 자바

by mingutistory 2020. 3. 27.
728x90

 

정답률 47%인데 나는 너무 어려워서 혼났다. 아직도 점화식을 세울 때 감을 못 잡고 있는 것 같다. 가장 먼저 생각했던 방법은 일단 최고값을 찾은 다음에 거기서 시작하는 거였는데 일단 배열의 처음부터 끝까지 비교하면서 나아가는 것이 중요한 듯. 

 

진짜 이해하는데도 오래 걸렸고 이해 한 것을 바탕으로 내 코드로 짜는데도 오래 걸렸다. 

그리고 테스팅 한 결과 맞다고 생각했는데 아래의 코드로 제출했더니 오류가 났다. 

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;


public class Main{
	
	
    public static void main(String args[])throws IOException{
    	BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
    	
    	int[][] dp = null;
    	int[][] sticker = null;
    	int su = 0;
    	
        int n = Integer.parseInt(br.readLine()); // test case number
        for(int i = 1; i <= n; i++) {
        	
            su = Integer.parseInt(br.readLine());
            dp = new int[2][su+1]; // 점화식 실행할 배열
            sticker = new int[2][su+1]; // 저장해 놓을 배열
            
            String[] first_line = br.readLine().split(" ");
            String[] second_line = br.readLine().split(" ");
           
            // sticker 배열에 값 저장
        	for(int j = 0; j < su; j++) {
        		sticker[0][j+1] = Integer.parseInt(first_line[j]);
        		sticker[1][j+1] = Integer.parseInt(second_line[j]);
        	}
        	
        	// dp 첫번째 행 초기화
        	dp[0][1] = sticker[0][1];
        	dp[1][1] = sticker[1][1]; 
        	
        	for(int k = 2; k <= su; k++) {
        		dp[0][k] = Math.max(dp[1][k-1], dp[1][k-2]) + sticker[0][k]; 
        		dp[1][k] = Math.max(dp[0][k-1], dp[0][k-2]) + sticker[1][k]; 
        	}            
        }
        
            System.out.println(Math.max(dp[0][su], dp[1][su]));

    }
   
}

진짜 확신했기 때문에 살짝 멘붕이었는데 다시 테스팅 해보니까 syso의 위치를 잘 못 넣었었다. 

 

public class Main{
	
	
    public static void main(String args[])throws IOException{
    	BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
    	
    	int[][] dp = null;
    	int[][] sticker = null;
    	int su = 0;
    	
        int n = Integer.parseInt(br.readLine()); // test case number
        for(int i = 1; i <= n; i++) {
        	
            su = Integer.parseInt(br.readLine());
            dp = new int[2][su+1]; // 점화식 실행할 배열
            sticker = new int[2][su+1]; // 저장해 놓을 배열
            
            String[] first_line = br.readLine().split(" ");
            String[] second_line = br.readLine().split(" ");
           
            // sticker 배열에 값 저장
        	for(int j = 0; j < su; j++) {
        		sticker[0][j+1] = Integer.parseInt(first_line[j]);
        		sticker[1][j+1] = Integer.parseInt(second_line[j]);
        	}
        	
        	// dp 첫번째 행 초기화
        	dp[0][1] = sticker[0][1];
        	dp[1][1] = sticker[1][1]; 
        	
        	for(int k = 2; k <= su; k++) {
        		dp[0][k] = Math.max(dp[1][k-1], dp[1][k-2]) + sticker[0][k]; 
        		dp[1][k] = Math.max(dp[0][k-1], dp[0][k-2]) + sticker[1][k]; 
        	}

            System.out.println(Math.max(dp[0][su], dp[1][su]));
            
        }
        

    }
   
}

 

거참 어리석은 일이다. 

꾸준히 혼자 풀려고 하는데 정말 꾸준하게 힌트를 얻어가면서 하고 있음. 마지막쯤에는 혼자 답을 낼 수 있겠지 라는 믿음을 가지며 계속 해보자. 

 

그래도 확실히 scanner보다 buffer을 사용하니까 채점 시간도 적게 걸리고 메모리도 적게 쓴다. 

300x250

댓글