package algo;
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.util.StringTokenizer;
public class AssemblyLineScheduling {
public static int N = 0; // 공정개수
public static int e1 = 0; // 1라인 진입 시간
public static int e2 = 0; // 2라인 진입 시간
public static int x1 = 0; // 1라인 마무리 시간
public static int x2 = 0; // 2라인 마무리 시간
public static int S1[] = null; // 1라인 공정소요 시간
public static int S2[] = null; // 2라인 공정소요 시간
public static int t1[] = null; // 1라인에서 2라인으로 변경시간
public static int t2[] = null; // 2라인에서 1라인으로 변경시간
public static int cache1[] = null; // 1라인 idx 지점까지의 최소시간
public static int cache2[] = null; // 2라인 idx 지점까지의 최소시간
public static void main(String[] args) throws Exception {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));
StringTokenizer st = new StringTokenizer(br.readLine());
N = Integer.parseInt(st.nextToken()); // [ 2, 300,000 ]
e1 = Integer.parseInt(st.nextToken());
e2 = Integer.parseInt(st.nextToken());
x1 = Integer.parseInt(st.nextToken());
x2 = Integer.parseInt(st.nextToken()); // [ 1, 200 ]
S1 = new int[N+1];
S2 = new int[N+1]; // [ 1, 200 ]
t1 = new int[N];
t2 = new int[N]; // [ 1, 200 ]
cache1 = new int[N+1];
cache2 = new int[N+1];
st = new StringTokenizer(br.readLine());
for (int i = 1 ; i <= N ; i++) {
S1[i] = Integer.parseInt(st.nextToken());
}
st = new StringTokenizer(br.readLine());
for (int i = 1 ; i <= N ; i++) {
S2[i] = Integer.parseInt(st.nextToken());
}
st = new StringTokenizer(br.readLine());
for (int i = 1 ; i < N ; i++) {
t1[i] = Integer.parseInt(st.nextToken());
}
st = new StringTokenizer(br.readLine());
for (int i = 1 ; i < N ; i++) {
t2[i] = Integer.parseInt(st.nextToken());
}
for (int idx = 1 ; idx <= N ; idx++) {
for (int line = 1 ; line <= 2 ; line++){
if (idx == 1) {
if (line == 1) {
cache1[1] = e1 + S1[1];
} else {
cache2[1] = e2 + S2[1]; // 기저 케이스
}
} else {
if (line == 1) {
cache1[idx] = Math.min(cache1[idx-1], cache2[idx-1] + t2[idx-1]) + S1[idx];
} else {
cache2[idx] = Math.min(cache2[idx-1], cache1[idx-1] + t1[idx-1]) + S2[idx];
}
}
}
}
int answer = Math.min(cache1[N] + x1, cache2[N] + x2);
bw.write(String.valueOf(answer));
bw.flush();
bw.close();
}
}
< Comment >
처음에는 함수를 만들어서 함수를 부를 때마다 이전의 최소합을 구하는 방식으로 진행했었습니다. 그러나 해당 방식으로 풀었을 경우에는 저로써는 1초라는 시간을 도저히 맞출수가 없었기 때문에 결국, 반복문을 통하여 풀이한 값들을 저장하는 방식으로 제한시간을 통과할 수 있었습니다. 생각하기가 조금 난해하다면, 함수로 풀어놓고 변경하는 것도 방법일 것 같습니다.
아래쪽이 처음 풀었던 코드입니다. 내용상으로는 같습니다.
package algo;
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.util.StringTokenizer;
public class AssemblyLineScheduling {
public static int N = 0; // 공정개수
public static int e1 = 0; // 1라인 진입 시간
public static int e2 = 0; // 2라인 진입 시간
public static int x1 = 0; // 1라인 마무리 시간
public static int x2 = 0; // 2라인 마무리 시간
public static int S1[] = null; // 1라인 공정소요 시간
public static int S2[] = null; // 2라인 공정소요 시간
public static int t1[] = null; // 1라인에서 2라인으로 변경시간
public static int t2[] = null; // 2라인에서 1라인으로 변경시간
public static int cache1[] = null; // 1라인 idx 지점까지의 최소시간
public static int cache2[] = null; // 2라인 idx 지점까지의 최소시간
public static void main(String[] args) throws Exception {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));
StringTokenizer st = new StringTokenizer(br.readLine());
N = Integer.parseInt(st.nextToken()); // [ 2, 300,000 ]
e1 = Integer.parseInt(st.nextToken());
e2 = Integer.parseInt(st.nextToken());
x1 = Integer.parseInt(st.nextToken());
x2 = Integer.parseInt(st.nextToken()); // [ 1, 200 ]
S1 = new int[N+1];
S2 = new int[N+1]; // [ 1, 200 ]
t1 = new int[N];
t2 = new int[N]; // [ 1, 200 ]
cache1 = new int[N+1];
cache2 = new int[N+1];
st = new StringTokenizer(br.readLine());
for (int i = 1 ; i <= N ; i++) {
S1[i] = Integer.parseInt(st.nextToken());
}
st = new StringTokenizer(br.readLine());
for (int i = 1 ; i <= N ; i++) {
S2[i] = Integer.parseInt(st.nextToken());
}
st = new StringTokenizer(br.readLine());
for (int i = 1 ; i < N ; i++) {
t1[i] = Integer.parseInt(st.nextToken());
}
st = new StringTokenizer(br.readLine());
for (int i = 1 ; i < N ; i++) {
t2[i] = Integer.parseInt(st.nextToken());
}
int answer = Math.min(dp(1, N) + x1, dp(2, N) + x2);
bw.write(String.valueOf(answer));
bw.flush();
bw.close();
}
// idx 번째 line 지점에 도달하여 작업 수행하기 까지 걸린시간
public static int dp (int line, int idx) {
if (cache1[idx] != 0 && line == 1) {
return cache1[idx];
} else if (cache2[idx] != 0 && line == 2) {
return cache2[idx];
} else if (idx == 1) {
if (line == 1){
return cache1[1] = e1 + S1[1];
} else {
return cache2[1] = e2 + S2[1]; // 기저 케이스
}
}
if (line == 1) {
return cache1[idx] = Math.min(dp(1, idx-1), dp(2, idx-1) + t2[idx-1]) + S1[idx];
} else {
return cache2[idx] = Math.min(dp(2, idx-1), dp(1, idx-1) + t1[idx-1]) + S2[idx];
}
}
}