๐ ์๊ณ ๋ฆฌ์ฆ ์ ํ
์ด๋ ค์ ๋ ์ด ๋ฌธ์ ,,, ๋ค๋ฅธ ์ฌ๋๋ค์ ์ฌ๋ฌ ํ์ด ๋ฐฉ์์ ์ฐธ๊ณ ํ๋ค๋ ๊ฒ์ ๋ฏธ๋ฆฌ ์๋ฆฐ๋ค.
์ด ๋ฌธ์ ๋ ๋ถํ ์ ๋ณต์ด๋ ์คํ๊ตฌ์กฐ๋ฅผ ํ์ฉํ์ฌ ํ ์ ์๋ค. ๊ทธ ์ค์์๋ ๋๋ ๊ตฌ๊ฐ ๋ด ๊ฐ์ด๋ฐ๋ฅผ ๊ธฐ์ค์ผ๋ก ๋ถํ ํ๋ ํ์ด ๋ฐฉ์์ ์ ํํ๋ค.
๐ ํ์ด
๊ฐ์ด๋ฐ๋ฅผ ๊ธฐ์ค์ผ๋ก ๋ถํ ํ์ฌ ํ์ดํ๋ ๊ณผ์ ์ ๋ค์๊ณผ ๊ฐ๋ค.
1. ๊ฐ์ด๋ฐ ์์น๋ฅผ ๊ตฌํ๋ค.
2. ๊ฐ์ด๋ฐ ์์น๋ฅผ ๊ธฐ์ค์ผ๋ก ๋ถํ ํ์ฌ ์ผ์ชฝ ๊ตฌ๊ฐ์ ๋์ด์ ์ค๋ฅธ์ชฝ ๊ตฌ๊ฐ์ ๋์ด๋ฅผ ๊ตฌํ๋ค.
3. ์ผ์ชฝ๊ณผ ์ค๋ฅธ์ชฝ ์ค ํฐ ๋์ด๋ฅผ ๋ณ์์ ์ ์ฅํ๋ค.
4. ๋ณ์์ ์ ์ฅ๋ ๋์ด์ ๋ ๊ตฌ๊ฐ์ ํฉ์น ๊ตฌ๊ฐ์ ๊ฐ์ฅ ํฐ ๋์ด๋ฅผ ๊ตฌํด ๋ ๊ฐ ์ค ๊ฐ์ฅ ํฐ ๋์ด๋ฅผ ๋ฐํํ๋ค.
๐ ์ฝ๋
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.StringTokenizer;
public class Main {
static int[] histogram;
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
StringTokenizer st;
StringBuilder sb= new StringBuilder();
int n;
while(true) {
st = new StringTokenizer(br.readLine(), " ");
n = Integer.parseInt(st.nextToken());
if(n == 0)
break;
histogram = new int[n];
for(int i = 0; i < n; i++) {
histogram[i] = Integer.parseInt(st.nextToken());
}
sb.append(getArea(0, n-1)).append('\n');
histogram = null;
}
System.out.println(sb);
}
public static long getArea(int lo, int hi) {
// ๋ง๋ ํญ์ด 1์ผ ๊ฒฝ์ฐ
if(lo == hi)
return histogram[lo];
// ๊ฐ์ด๋ฐ ์์น ๊ตฌํ๊ธฐ
int mid = (lo + hi) / 2;
// ๊ฐ์ด๋ฐ ์์น๋ฅผ ๊ธฐ์ค์ผ๋ก ๋ถํ ํ์ฌ ์ผ์ชฝ ๊ตฌ๊ฐ ๋์ด์ ์ค๋ฅธ์ชฝ ๊ตฌ๊ฐ ๋์ด ๊ตฌํ๊ธฐ
long leftArea = getArea(lo, mid);
long rightArea = getArea(mid+1, hi);
// ์ผ์ชฝ๊ณผ ์ค๋ฅธ์ชฝ ์ค ํฐ ๋์ด๋ฅผ ๋ณ์์ ์ ์ฅํ๊ธฐ
long max = Math.max(leftArea, rightArea);
// ๋ณ์์ ์ ์ฅ๋ ๋์ด์ ๋ ๊ตฌ๊ฐ์ ํฉ์น ๊ตฌ๊ฐ์ ๊ฐ์ฅ ํฐ ๋์ด๋ฅผ ๊ตฌํด ๋ ๊ฐ ์ค ๊ฐ์ฅ ํฐ ๋์ด๋ฅผ ๋ฐํํ๊ธฐ
max = Math.max(max, getMidArea(lo, hi, mid));
return max;
}
public static long getMidArea(int lo, int hi, int mid) {
int toLeft = mid; // ์ค๊ฐ์ง์ ์ผ๋ก๋ถํฐ ์ผ์ชฝ์ผ๋ก ๊ฐ ๋ณ์
int toRight = mid; // ์ค๊ฐ์ง์ ์ผ๋ก๋ถํฐ ์ค๋ฅธ์ชฝ์ผ๋ก ๊ฐ ๋ณ์
long height = histogram[mid]; // ๋์ด
// ์ด๊ธฐ ๋์ด
long maxArea = height;
// ์๋ ๋ฒ์๋ฅผ ๋ฒ์ด๋๊ธฐ ์ ๊น์ง ๋ฐ๋ณต
while(lo < toLeft && toRight < hi) {
// ์์ชฝ ๋ค์์นธ์ ๋์ด ์ค ๋์ ๊ฐ ์ ํ
if(histogram[toLeft-1] < histogram[toRight+1]) {
toRight++;
height = Math.min(height, histogram[toRight]);
}
else {
toLeft--;
height = Math.min(height, histogram[toLeft]);
}
maxArea = Math.max(maxArea, height*(toRight-toLeft+1));
}
// ์ค๋ฅธ์ชฝ ๊ตฌ๊ฐ์ ๋๊น์ง ํ์ ๋ชปํ๋ค๋ฉด ๋ง์ ํ์
while(toRight < hi) {
toRight++;
height = Math.min(height, histogram[toRight]);
maxArea = Math.max(maxArea, height*(toRight-toLeft+1));
}
// ์ผ์ชฝ ๊ตฌ๊ฐ์ ๋๊น์ง ํ์ ๋ชปํ๋ฐ๋ฉด ๋ง์ ํ์
while(lo < toLeft) {
toLeft--;
height = Math.min(height, histogram[toLeft]);
maxArea = Math.max(maxArea, height*(toRight-toLeft+1));
}
return maxArea;
}
}
https://www.acmicpc.net/problem/6549
6549๋ฒ: ํ์คํ ๊ทธ๋จ์์ ๊ฐ์ฅ ํฐ ์ง์ฌ๊ฐํ
์ ๋ ฅ์ ํ ์คํธ ์ผ์ด์ค ์ฌ๋ฌ ๊ฐ๋ก ์ด๋ฃจ์ด์ ธ ์๋ค. ๊ฐ ํ ์คํธ ์ผ์ด์ค๋ ํ ์ค๋ก ์ด๋ฃจ์ด์ ธ ์๊ณ , ์ง์ฌ๊ฐํ์ ์ n์ด ๊ฐ์ฅ ์ฒ์์ผ๋ก ์ฃผ์ด์ง๋ค. (1 ≤ n ≤ 100,000) ๊ทธ ๋ค์ n๊ฐ์ ์ ์ h1, ..., hn (0 ≤ hi ≤
www.acmicpc.net
'Algorithm' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[SQL] CASE | ์กฐ๊ฑด์ ๋ฐ๋ผ ์ปฌ๋ผ๊ฐ ๋ณ๊ฒฝ ์ถ๋ ฅ ํ๊ธฐ | ํ๋ก๊ทธ๋๋จธ์ค ์กฐ๊ฑด์ ๋ถํฉํ๋ ์ค๊ณ ๊ฑฐ๋ ์ํ ์กฐํํ๊ธฐ (0) | 2023.04.26 |
---|---|
๋ฐฑ์ค 1806๋ฒ : ๋ถ๋ถํฉ | JAVA (0) | 2023.04.25 |
๋ฐฑ์ค 11049๋ฒ : ํ๋ ฌ ๊ณฑ์ ์์ | JAVA (0) | 2023.04.08 |
[JAVA] Deque ๋ฑ (0) | 2023.04.06 |
๋ฐฑ์ค 10942๋ฒ : ํฐ๋ฆฐ๋๋กฌ? | JAVA (0) | 2023.04.04 |
๋๊ธ