Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
45 changes: 45 additions & 0 deletions study/week6/JUN2616_JoInHyeok.java
Original file line number Diff line number Diff line change
@@ -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]);
}
}
71 changes: 71 additions & 0 deletions study/week6/JUN9252_JoInHyeok.java
Original file line number Diff line number Diff line change
@@ -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);
}
}



}