From 3c6631e8725a96e17ce64b4d0210be74dde8f18f Mon Sep 17 00:00:00 2001 From: inhyeok Date: Tue, 28 Feb 2023 21:10:25 +0900 Subject: [PATCH] =?UTF-8?q?[6=EC=A3=BC=EC=B0=A8]=20=EC=A1=B0=EC=9D=B8?= =?UTF-8?q?=ED=98=81=EB=B0=B1=EC=A4=80=209252,2616=ED=92=80=EC=9D=B4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- study/week6/JUN2616_JoInHyeok.java | 45 +++++++++++++++++++ study/week6/JUN9252_JoInHyeok.java | 71 ++++++++++++++++++++++++++++++ 2 files changed, 116 insertions(+) create mode 100644 study/week6/JUN2616_JoInHyeok.java create mode 100644 study/week6/JUN9252_JoInHyeok.java diff --git a/study/week6/JUN2616_JoInHyeok.java b/study/week6/JUN2616_JoInHyeok.java new file mode 100644 index 0000000..cd7125c --- /dev/null +++ b/study/week6/JUN2616_JoInHyeok.java @@ -0,0 +1,45 @@ +import java.io.BufferedReader; +import java.io.IOException; +import java.io.InputStreamReader; +import java.util.StringTokenizer; + +public class Main { + + static int N; + static int[] arr; + static int[] sum; + /* + * 소형 기관차 3대/ 소형 기관차는 연속적인 객차 손님을 태울 수 있고, 같은 수의 객차만 몰아야 한다. + * 입력 : 최대로 끌 수 있는 객차의 수를 주어줌. + */ + public static void main(String[] args) throws IOException { + BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); + StringBuilder sb = new StringBuilder(); + + N = Integer.parseInt(br.readLine()); + arr = new int[N+1]; + sum = new int[N+1]; // 0값을 갖고 있어야 처리 하기 편해서 +1을 해준다. + + StringTokenizer st = new StringTokenizer(br.readLine()); + for (int i = 1 ; i<= N ; i++){ + arr[i] = Integer.parseInt(st.nextToken()); + sum[i] = sum[i-1] + arr[i]; + } + int MAX = Integer.parseInt(br.readLine()); + /* + * memo[small][N(객차 index)] + * 소형 기관차를 0개 , 1개 2개선택 3개 선택..까지 + */ + int[][] memo = new int[4][N+1]; + for (int small = 1 ; small <= 3; small++){ + + for (int i = small * MAX ; i <=N ; i++){ + memo[small][i] = Math.max( memo[small-1][i-MAX] + (sum[i]- sum[i-MAX]), memo[small][i-1]); + // memo[small][i-1] <- 이전 값의 저장된 값 vs + // memo[small-1][i-MAX] => 현재 소형 기관차 개수 -1+ (sum[i]- sum[i-MAX]), + } + } + + System.out.println(memo[3][N]); + } +} diff --git a/study/week6/JUN9252_JoInHyeok.java b/study/week6/JUN9252_JoInHyeok.java new file mode 100644 index 0000000..ed210f7 --- /dev/null +++ b/study/week6/JUN9252_JoInHyeok.java @@ -0,0 +1,71 @@ +import java.io.BufferedReader; +import java.io.IOException; +import java.io.InputStreamReader; +import java.util.Arrays; + + +public class Main { + + static int[][] memo; + static boolean[][] visit; + static String str1; + static String str2; + static StringBuilder sb = new StringBuilder(); + public static void main(String[] args) throws IOException { + BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); + str1= br.readLine(); + str2= br.readLine(); + + // 공집합 표현 + memo = new int[str2.length()+1][str1.length()+1]; + visit = new boolean[str2.length()+1][str1.length()+1]; + + /* + * 점화 식.. if(x==y) LCS(x-1,y-1)+1 + * if(x!=y) max(LCS(xi-1,Yj), LCS(i,j-1)); + */ + + for (int i = 1; i <= str2.length(); i++){ + for (int j = 1 ; j <= str1.length(); j++){ + if(str2.charAt(i-1) == str1.charAt(j-1)){ + memo[i][j] = memo[i-1][j-1]+1; + }else { + memo[i][j] = Math.max(memo[i-1][j],memo[i][j-1]); + } + } + } + + + System.out.println(memo[str2.length()][str1.length()]); + printLCS(str1.length(), str2.length()); + System.out.println(sb.reverse().toString()); + } + + private static void printLCS(int x, int y){ // str1 ->x , str2 -> y + if(x == 0 || y== 0){ + return ; + } + if(memo[y][x] > memo[y][x-1] && memo[y][x] > memo[y-1][x] && memo[y][x] > memo[y-1][x-1]){ + // 앞 3개보다 크면 + sb.append(str1.charAt(x-1)); + printLCS(x-1,y-1); + return; + } + + if(memo[y][x-1] > memo[y-1][x] ){ + printLCS(x-1, y); + return; + } + + if(memo[y-1][x] > memo[y][x-1]){ + printLCS(x,y-1); + return; + } + if(memo[y-1][x] == memo[y][x-1] && memo[y-1][x]==memo[y][x]){ + printLCS(x-1,y); + } + } + + + +} \ No newline at end of file