https://www.acmicpc.net/problem/2559
์ค๋ต๋ ธํธ(ํธ๋ ๋์ ์ฌ๊ณ ๊ณผ์ ๋ฐ ๊ฐ์ ์ )
๋์ ํฉ ๋ฌธ์ ๋ค.
์ฒ์์ ๊ณ ๋ ค์ํ ๋ถ๋ถ์ ๋์ ํฉ ๋ฐฐ์ด ์์ ์ธ๋ฑ์ค ๋ถ๋ถ์ด๋ค.
import java.io.BufferedReader;
import java.io.FileInputStream;
import java.io.InputStreamReader;
import java.util.Arrays;
import java.util.PriorityQueue;
import java.util.StringTokenizer;
public class Main {
static int n, gap;
public static void main(String[] args) throws Exception {
//System.setIn(new FileInputStream("res/input.txt"));
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
StringTokenizer st = new StringTokenizer(br.readLine());
n = Integer.parseInt(st.nextToken());
gap = Integer.parseInt(st.nextToken());
int[] in = new int[n];
int[] prefix = new int[n];
st = new StringTokenizer(br.readLine());
for (int i = 0; i < n; i++) {
in[i] = Integer.parseInt(st.nextToken());
if (i == 0) {
prefix[i] = in[i];
} else {
// ๋์ ํฉ
prefix[i] = prefix[i - 1] + in[i];
}
}
PriorityQueue<Integer> pq = new PriorityQueue<>((o1, o2) -> {
return o2 - o1;
});
//์ด์ ๊ฐ ๊ฐ๊ฒฉ์ ํฉ์ pq์ ๋ฃ๊ธฐ
int idx = n - 1;
while (true) {
if (idx - gap < 0) break;
// System.out.println(prefix[idx] + ", " + prefix[idx - gap]);
pq.add(prefix[idx] - prefix[idx - gap]);
idx--;
}
System.out.println(pq.poll());
}
}
์ด๋ ๊ฒ ํด๋ฒ๋ฆฌ๋ฉด ๋ฌด์จ ๋ฌธ์ ๊ฐ ์๊ธฐ๋๋ฉด
10 3
100 -1 -1 -1 -1 -1 -1 -1 -1 -1
์ด ์ ๋ ฅ์ด ๋ค์ด์ฌ ๋ ๋์ ํฉ ๋ฐฐ์ด์๋ ๋ค ๋ค์ด๊ฐ์ง๋ง, ๊ฐ๊ฒฉ์ ๋ํ ๋ 98์ด ์ต๋๊ฐ์ด ์๋๋ผ 3์ด ์ต๋๊ฐ์ด ๋์๋ฒ๋ฆฐ๋ค.
[100, 99, 98, 97, 96, 95, 94, 93, 92, 91]
์ด๊ฒ size๊ฐ n์ธ prefix์ธ๋ฐ, ๋ด ๋ก์ง ์ `n`๋ฒ์งธ - `n-k`๋ฒ์งธ ๋์ ํฉ ํญ๋ชฉ์ ๋นผ๋ฉด ๊ทธ ์ฌ์ด์ ๋์ ํฉ์ด ๋์ค๋๋ก ๋์ด์๋ค. ์ด ๊ฒฝ์ฐ -3์ด ๋์ค๊ฒ ๋๊ณ , ์๋๋ผ๋ฉด 100, -1, -1 ์ด ์ธ ์์ ํฉ์ด 98์ธ๋ฐ, ์์ ํญ๋ชฉ์ ๊ฐ๊ฒฉ์ผ๋ก ์ก๊ณ ๊ฐ๋ฒ๋ฆฐ ์ ์ด ๋ผ์ -3์ด ๋์ค๊ฒ ๋๋ค. ๊ทธ๋์ ์์ ๋ถ๋ถ์ ๊ณ ๋ คํ๊ฒ ๋๋ฉด n+1 ํฌ๊ธฐ๋ฅผ ๊ฐ์ง prefix ๋ฐฐ์ด์ ๋ง๋ค์ด์ผ ํ๊ณ , ์๋์ ๊ฐ์ด ๋์ ํฉ ๋ฐฐ์ด์ด ๊ตฌ์ฑ๋๋ค.
prefix ๋ฐฐ์ด ๊ตฌ์ฑํ ๋๋ ๊ทธ๋์ 1์นธ ๋ ํฌ๊ฒ ํ๋๊ฒ ์ข์ ๊ฒ ๊ฐ๋ค. DP๋ ๊ฑฐ์ ๋์ผํ ๊ฐ๋ ์ผ๋ก ์ดํดํ๋ค.
[0, 100, 99, 98, 97, 96, 95, 94, 93, 92, 91]
๋น์ทํ ๋ฌธ์ ๋ก ์ฐ์ํฉ์ด ์๋ค.
๋ช ๋ฒ ์ฐ์ํด๋ ์ข์ผ๋๊น ์ฐ์ํ ํฉ์ด ๊ฐ์ฅ ํฐ ์๋ฅผ ๊ตฌํ๋ ๋ฌธ์ ๋ค.
https://www.acmicpc.net/problem/1912
์ฌ๊ธฐ์ ๋ ์ฌ๋ฆฐ ์์ด๋์ด๋ ์ด์ฐจํผ ๋์ ํด์ ํฉํ๋๋ฐ, ๊ฐ์ด ์์์ง๋ ๊ฒฝ์ฐ์๋ ๋ํ์ง ์๊ณ ๊ฐ๊ฒ ๋ค๋ ๊ฒ์ด๋ค.
for (int i = 0; i < n; i++) {
in[i] = Integer.parseInt(st.nextToken());
}
PriorityQueue<Integer> pq = new PriorityQueue<>((o1, o2) -> {
return o2 - o1;
});
for (int i = 1; i <= n; i++) {
prefix[i] = Math.max(prefix[i-1]+in[i-1], in[i-1]);
pq.add(prefix[i]);
}
์ด๋ฌ๋ฉด ๊ฐ์ด ์ฃผ์ด์ง ์ ๋ ฅ ๋ฐฐ์ด๋ณด๋ค ์์ ๋์ ํฉ ์์น๊ฐ ๋ฐ์ํ๋ฉด, ๋์ ํฉ ๊ฐ์ ์ด์ ์ฐ์ํฉ์ ๋ฌด์ํ๊ณ , ์๋ก ์์ํ๋ค.
์ผ์ข ์ DP๋ผ๊ณ ๋ณผ์๋ ์์ง์์๊น?
์ข ๋ ๋์ด๋์๋ ๋ฌธ์ ๋ฅผ ์ดํด๋ณด๊ธฐ ์ํด ๋์ ํฉ์ 2๋ฒ์ฐ๋ ๋ฌธ์ ๋ฅผ ํ์ด๋ดค๋ค.
https://www.acmicpc.net/problem/2304
๋ฌธ์ ๋ฅผ ์ ์ฝ์ด์ผํ๋ค. ์ ๋ถ ์์์ ์ ์ฃผ๋ ๊ฒ์ด ํต์ฌ์ด๋ค.
import java.io.BufferedReader;
import java.io.FileInputStream;
import java.io.InputStreamReader;
import java.util.Arrays;
import java.util.StringTokenizer;
public class Main {
public static void main(String[] args) throws Exception {
// System.setIn(new FileInputStream("res/input.txt"));
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
StringTokenizer st = new StringTokenizer(br.readLine(), " ");
int n = Integer.parseInt(st.nextToken());
int maxH = -1;
int maxIdx = -1;
int[] input = new int[10001];
for (int i = 0; i < n; i++) {
st = new StringTokenizer(br.readLine(), " ");
int idx = Integer.parseInt(st.nextToken()); // ๊ธฐ๋ฅ ์ผ์ชฝ๋ฉด์ ์์น
int h = Integer.parseInt(st.nextToken());
input[idx + 1] = h; // idx ์์ฒด๋ 0์ด ์์ผ๋, 0-1 ,1-2 ์ด๋ ๊ฒ ๊ฐ๊ฒฉ์ผ๋ก ๋ค์ด๊ฐ -> ์ ํํ๋ ์ผ์ชฝ ๋ชจ์๋ฆฌ ๊ธฐ์ค์ด๋๊น ํ๋์ฉ ๋ฐ๊ธฐ
maxIdx = Math.max(idx, maxIdx);
maxH = Math.max(h, maxH);
}
int[] pref = new int[maxIdx + 2]; // ์๋ค์ ํ์นธ์ฉ ์ถ๊ฐํ๊ธฐ
int[] suff = new int[maxIdx + 2]; // ์๋ค์ ํ์นธ์ฉ ์ถ๊ฐํ๊ธฐ
int[] maxPoint = new int[2]; //
Arrays.fill(maxPoint, -1);
int prev = 0;
int prefSum = -1;
int suffSum = -1;
// l to r
for (int i = 1; i <= maxIdx + 1; i++) {
prev = Math.max(input[i], prev);
pref[i] = pref[i - 1] + prev;
if (input[i] == maxH) {
maxPoint[0] = i;
break;
}
}
prev = 0;
for (int i = maxIdx + 1; i >= 0; i--) {
prev = Math.max(input[i], prev);
suff[i - 1] = suff[i] + prev;
if (input[i] == maxH) {
maxPoint[1] = i;
break;
}
}
// max๊น์ง ํฉ
int maxLToR = -1;
int maxRToL = -1;
for (int i = 0; i < maxPoint[0]; i++) {
maxLToR = Math.max(maxLToR, pref[i]);
}
for (int i = maxIdx + 1; i >= maxPoint[1]; i--) {
maxRToL = Math.max(maxRToL, suff[i]);
}
// System.out.println(maxLToR + ", " + maxRToL);
// ํฉ์น๊ธฐ
int maxWidth = maxPoint[1] - maxPoint[0] + 1;
//
// System.out.println(Arrays.toString(pref) + ", " + maxPoint[0] + ", " + maxH);
// System.out.println(Arrays.toString(suff) + ", " + maxPoint[1] + ", " + maxH);
System.out.println(maxLToR + maxRToL + maxWidth * maxH);
}
}
์์ ํ ๊ฐ์ ๋ฐฉ์์ผ๋ก ์๋ ๋ฌธ์ ๋ ํ์์๋ค.
https://www.acmicpc.net/problem/14719
import java.io.BufferedReader;
import java.io.FileInputStream;
import java.io.InputStreamReader;
import java.util.Arrays;
import java.util.StringTokenizer;
public class Main {
public static void main(String[] args) throws Exception {
System.setIn(new FileInputStream("res/input.txt"));
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
StringTokenizer st = new StringTokenizer(br.readLine());
int H = Integer.parseInt(st.nextToken());
int W = Integer.parseInt(st.nextToken());
int[] heights = new int[W];
st = new StringTokenizer(br.readLine(), " ");
for (int i = 0; i < W; i++) {
heights[i] = Integer.parseInt(st.nextToken());
}
int[] leftMax = new int[W]; // ์๋ค๊ฐ ์ฐฝ๊ณ ๋ค๊ฐํ์ ์๋ prefix, suffix ์ญํ
int[] rightMax = new int[W];
// ์ผ์ชฝ์์ ๋ณธ ์ต๋ ๋์ด ๊ณ์ฐ
leftMax[0] = heights[0];
for (int i = 1; i < W; i++) {
leftMax[i] = Math.max(leftMax[i - 1], heights[i]);
}
// ์ค๋ฅธ์ชฝ์์ ๋ณธ ์ต๋ ๋์ด ๊ณ์ฐ
rightMax[W - 1] = heights[W - 1];
for (int i = W - 2; i >= 0; i--) {
rightMax[i] = Math.max(rightMax[i + 1], heights[i]);
}
// ๋น๋ฌผ์ด ๊ณ ์ผ ์ ์๋ ์ ๊ณ์ฐ
int water = 0;
for (int i = 0; i < W; i++) {
int minHeight = Math.min(leftMax[i], rightMax[i]);
if (minHeight > heights[i]) {
water += minHeight - heights[i];
}
}
System.out.println(water);
}
}
์ ๋ต์ฝ๋
import java.io.BufferedReader;
import java.io.FileInputStream;
import java.io.InputStreamReader;
import java.util.Arrays;
import java.util.PriorityQueue;
import java.util.StringTokenizer;
public class Main {
static int n, gap;
public static void main(String[] args) throws Exception {
System.setIn(new FileInputStream("res/input.txt"));
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
StringTokenizer st = new StringTokenizer(br.readLine());
n = Integer.parseInt(st.nextToken());
gap = Integer.parseInt(st.nextToken());
int[] in = new int[n];
int[] prefix = new int[n+1];
st = new StringTokenizer(br.readLine());
for (int i = 0; i < n; i++) {
in[i] = Integer.parseInt(st.nextToken());
prefix[i+1] = prefix[i] + in[i];
}
System.out.println(Arrays.toString(prefix));
PriorityQueue<Integer> pq = new PriorityQueue<>((o1, o2) -> {
return o2 - o1;
});
//์ด์ ๊ฐ ๊ฐ๊ฒฉ์ ํฉ์ pq์ ๋ฃ๊ธฐ
int idx = n;
while (true) {
if (idx - gap < 0) break;
pq.add(prefix[idx] - prefix[idx - gap]);
idx--;
}
System.out.println(pq.poll());
}
}
import java.io.BufferedReader;
import java.io.FileInputStream;
import java.io.InputStreamReader;
import java.util.Arrays;
import java.util.PriorityQueue;
import java.util.StringTokenizer;
public class Main {
static int n;
public static void main(String[] args) throws Exception {
// System.setIn(new FileInputStream("res/input.txt"));
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
StringTokenizer st = new StringTokenizer(br.readLine());
n = Integer.parseInt(st.nextToken());
int[] in = new int[n];
int[] prefix = new int[n + 1];
st = new StringTokenizer(br.readLine());
for (int i = 0; i < n; i++) {
in[i] = Integer.parseInt(st.nextToken());
}
PriorityQueue<Integer> pq = new PriorityQueue<>((o1, o2) -> {
return o2 - o1;
});
for (int i = 1; i <= n; i++) {
prefix[i] = Math.max(prefix[i-1]+in[i-1], in[i-1]);
pq.add(prefix[i]);
}
// System.out.println(Arrays.toString(prefix));
System.out.println(pq.poll());
}
}
๋์์ด ๋๋ค๋ฉด ๋๊ธ์ด๋ ๊ณต๊ฐ ๋ฒํผ ํ ๋ฒ์ฉ ๋๋ฅด๊ณ ๊ฐ์ฃผ์ธ์!
'OJ๐ผ > ์ค๋ต๋ ธํธ๐' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[BOJ][JAVA] 31418: ์คํ์ง (0) | 2025.02.09 |
---|---|
[BOJ][JAVA] 1753๋ฒ: ์ต๋จ๊ฒฝ๋ก (0) | 2024.03.25 |
[BOJ][JAVA] 1149๋ฒ, 17404๋ฒ : RGB ๊ฑฐ๋ฆฌ1, RGB ๊ฑฐ๋ฆฌ2 (0) | 2024.03.19 |
[BOJ][JAVA] 7576๋ฒ : ํ ๋งํ (0) | 2024.03.19 |
[BOJ][JAVA] 17822๋ฒ: ์ํ๋๋ฆฌ๊ธฐ (0) | 2024.03.17 |