-
백준 14002 가장 긴 증가하는 부분 수열 4 동적계획법 활용 풀이 ( Java )Problem Solving/Java 2019. 11. 1. 11:45반응형
위에서 푼 것과 비슷한 문제. 대신 수열 자체를 찍어줘야 했는데
처음엔 마지막 최대값이 바뀔 때마다 arrayList에 추가해서 그걸 찍어주는 방식으로 접근했는데
주어진 테스트 케이스 수행할 때는 정답이 나왔지만 제출하니 '틀렸습니다'가 떴다.
질문 글을 찾아보니 반례 케이스 ( 7 / 1 6 2 4 5 3 7 을 입력했을 때 5 / 1 2 4 5 7 이 나와야 한다 )가 있어서 넣고 돌려보니 실패 확인.
- 틀렸던 코드
1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465import java.util.ArrayList;public class Main {public static void main(String[] args) throws IOException {BufferedReader br = new BufferedReader(new InputStreamReader(System.in));BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));int n = Integer.parseInt(br.readLine());int[] a = new int[n];// 숫자들 저장할 배열int[] d = new int[n];// 증가하는 수열 길이 저장할 배열// d[i] = a[1], ~~ a[i] 까지 수열이 있을 때 a[i]를 마지막으로 하는 가장 긴 증가하는 부분 수열의 길이String[] words = br.readLine().split(" ");for (int i = 0; i < words.length; i++) {a[i] = Integer.parseInt(words[i]);}// split 해서 숫자를 넣는다for (int i = 0; i < n; i++) {// 0부터 n까지d[i] = 1;// 증가하는 수열 길이를 1로 놓고for (int j = 0; j < i; j++) {// 처음부터 i까지 비교하며if (a[j] < a[i] && d[i] < d[j] + 1) {// a[i]가 a[j] 보다 크고 d[j] + 1 값이 d[i]보다 길면d[i] = d[j] + 1;// 증가하는 수열 길이를 증가시켜준다}}}int answer = 0;ArrayList<Integer> al = new ArrayList<Integer>();// 연속 수열 저장할 arraylistfor (int i = 0; i < d.length; i++) {// d 배열에서if (answer < d[i]) {answer = d[i];al.add(a[i]);// 최대값과 증가하는 부분 수열 찾아서}}}// 출력}}결국 역추적 배열을 하나 만들어서 인덱스를 저장하고 따라가서 출력하는 방식으로 정답을 받았다
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081public class Main {static int[] a;// 숫자들 저장할 배열static int[] v;// 역추적에 활용할 배열static void go(int p, BufferedWriter bw) throws IOException {if (p == -1) {return;}go(v[p], bw);}public static void main(String[] args) throws IOException {BufferedReader br = new BufferedReader(new InputStreamReader(System.in));BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));int n = Integer.parseInt(br.readLine());a = new int[n];v = new int[n];// 배열 메모리 할당int[] d = new int[n];// 증가하는 수열 길이 저장할 배열// d[i] = a[1], ~~ a[i] 까지 수열이 있을 때 a[i]를 마지막으로 하는 가장 긴 증가하는 부분 수열의 길이String[] words = br.readLine().split(" ");for (int i = 0; i < words.length; i++) {a[i] = Integer.parseInt(words[i]);}// words 를 split 해서 숫자를 넣는다for (int i = 0; i < n; i++) {// 0부터 n까지d[i] = 1;// 증가하는 수열 길이는 일단 1로 놓고v[i] = -1;// 역추적 배열은 일단 -1로 놓는다 ( 0부터 시작하니 )for (int j = 0; j < i; j++) {// 처음부터 i까지 비교하며if (a[j] < a[i] && d[i] < d[j] + 1) {// a[i]가 a[j] 보다 크고 d[j] + 1 값이 d[i]보다 길면d[i] = d[j] + 1;// 증가하는 수열 길이를 증가시켜주고v[i] = j;// 역추적하기 위해 배열 인덱스 저장}}}int answer = 0;int p = 0;for (int i = 0; i < d.length; i++) {// d 배열에서if (answer < d[i]) {// 최대값이 바뀌는 순간마다answer = d[i];// 최대값과 저장하고p = i;// 제일 클 경우의 인덱스 젖아해서}}// 최대값 출력하고go(p, bw);// 재귀로 출력한다 증가하는 부분 수열 출력}}반응형'Problem Solving > Java' 카테고리의 다른 글
백준 1699 제곱수의 합 동적계획법 활용 풀이 ( Java ) (0) 2019.11.01 백준 1912 연속합 동적계획법 활용 풀이 ( Java ) (0) 2019.11.01 백준 11053 가장 긴 증가하는 부분 수열 동적계획법 활용 풀이 (Java) (0) 2019.11.01 백준 2193 이친수 동적계획법 활용 2가지 풀이 ( Java ) (0) 2019.11.01 백준 15990 1,2,3 더하기 5 동적계획법 활용 풀이 ( Java ) (0) 2019.10.30