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
'알고리즘' 카테고리의 다른 글
프로그래머스 LEVEL1 완주하지 못한 선수 (0) | 2020.04.03 |
---|---|
[200324/D-8] 백준 알고리즘 공부 (0) | 2020.03.24 |
[200320/D-7] 백준 알고리즘 공부 (0) | 2020.03.20 |
[200319/D-6] 백준 알고리즘 공부 (0) | 2020.03.20 |
[200318/D-5] 백준 알고리즘 공부 (0) | 2020.03.18 |
댓글