๋ฌธ์ ์กฐ๊ฑด์ ์ฝ์ด๋ณด๋ฉด '์ง๋ถ์ ์ด๋ ๋ถ๋ถ๋ ์ค๋ชฉํ๊ฒ ๋ค์ด๊ฐ ๋ถ๋ถ์ด ์์ด์ผ ํ๋ค.'๋ผ๋ ์กฐ๊ฑด์ด ์๋ค. ์ด ์กฐ๊ฑด์ ์ปค์ก๋ค ์์์ก๋ค ๋ค์ ์ปค์ง ์ ์๋ค๋ ๋ง์ด๊ณ , ๊ทธ๋ฌ๋ ค๋ฉด ๊ฐ์ฅ ์ปค์ง๋ ์ต๋ ์ง์ ์ด ์ด๋์ง ์์์ผ ํ๋ค.
์ฒ์ ์๊ฐ๋ฌ๋ ๊ฑด ์ผ์ชฝ → ์ค๋ฅธ์ชฝ์ผ๋ก ๋ฐ๋ณต์ ๋๋ฉด์ ์ด์ ๋ณด๋ค ํฐ ๊ฐ, ๋๋ ์์ ๊ฐ์ ๋ถ๋ฅํด์ ๊ตฌ๋ถํด๋ผ ์์ ์ด์์ผ๋ ๊ฐ์ฅ ์ปค์ง๋ ์ง์ ์ด ์ด๋์ง ๋ชฐ๋ผ์ ๊ตฌํํ ์ ์์๋ค.
๊ทธ๋์ ์๊ฐํด๋ธ ๋ฐฉ๋ฒ์ ๊ฐ์ฅ ๋์ ๊ธฐ๋ฅ์ ๊ธฐ์ค์ผ๋ก ์ผ์ชฝ, ์ค๋ฅธ์ชฝ์ผ๋ก ๊ฐ ์๋ก ์ ์ ๋์ด๊ฐ ์์์ ธ์ผ ํ๋ค.
์๋ฅผ ๋ค์ด, ์ฃผ์ด์ง ํ
์คํธ ์ผ์ด์ค์์ ๊ฐ์ฅ ๋์ด๊ฐ ๋์ (8, 10)์ ๊ฐ์ด๋ฐ์ ๋๊ณ ๊ฐ์ฅ ์ผ์ชฝ์ (2, 4), ๊ฐ์ฅ ์ค๋ฅธ์ชฝ์ (15, 8)์ด๋ค. ์ผ์ชฝ, ๊ฐ์ด๋ฐ, ์ค๋ฅธ์ชฝ ์ฝ์์ผ๋ก ํํํด๋ณผ ๋ ์ผ์ชฝ๊ณผ ๊ฐ์ด๋ฐ ์ฌ์ด์๋ ์ผ์ชฝ์์ ๊ฐ์ด๋ฐ๋ก ๊ฐ ์๋ก ์ ์ ์ปค์ง๋ ๊ฒ๋ค๋ง ์ถ๋ ค๋ด์ผ ํ๊ณ ๊ฐ์ด๋ฐ์์ ์ค๋ฅธ์ชฝ์ผ๋ก ๊ฐ ์๋ก ์ ์ ์์์ง๋ ๊ฒ๋ค๋ง ์ถ๋ ค๋ด์ผ ํ๋ค. ๋ํ, ์ถ๋ ค๋ผ ๋ ์ผ์ชฝ๊ณผ ์ค๋ฅธ์ชฝ๋ณด๋ค ์์ ๊ฐ์ ์ ํ๋์ด์๋ ์๋๋ค.
์ฝ๋๋ฅผ ์ง๋ฉด์ ๊ณ ๋ คํด๋ด์ผ ํ ์ฌํญ์ ์๋์ ๊ฐ๋ค.
๊ฐ์ฅ ํฐ ๊ฐ์ด ๊ฐ์ด๋ฐ์ ์์์ง, ์ผ์ชฝ ๋๋ ์ค๋ฅธ์ชฝ์ ์์์ง ๊ณ ๋ ค
๊ฐ์ฅ ํฐ ๊ฐ์ด ํ๋๊ฐ ์๋ ๊ฒฝ์ฐ ๊ณ ๋ ค
๋ชจ๋ ๊ฐ์ด ๊ฐ์ ๊ฒฝ์ฐ ๊ณ ๋ ค
์๋ฐ๋ก ์์ฑํ ์ฝ๋๋ ์๋์ ๊ฐ๋ค.
package codingTest;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.StringReader;
import java.util.ArrayList;
import java.util.Collections;
import java.util.Comparator;
import java.util.List;
public class Beakjoon2304 {
static BufferedReader input = new BufferedReader(new InputStreamReader(System.in));
static List<LH> columnList = new ArrayList<>();
static String sample =
"7\r\n" +
"2 4\r\n" +
"11 4\r\n" +
"15 8\r\n" +
"4 6\r\n" +
"5 3\r\n" +
"8 10\r\n" +
"13 6";
public static void main(String[] args) throws NumberFormatException, IOException {
// ์
๋ ฅ ๋ฐ์ดํฐ ์ธํ
BufferedReader input = new BufferedReader(new StringReader(sample)); // ์ํ ๋ฐ์ดํฐ ์ฝ๊ธฐ
int numberOfColumn = Integer.parseInt(input.readLine()); // ๊ธฐ๋ฅ์ ๊ฐ์(N) ์ฝ๊ธฐ
for (int i = 0; i < numberOfColumn; i++) { // ์์น(L), ๋์ด(H) ๋ชฉ๋ก ์ฝ๊ธฐ
columnList.add(new LH(input.readLine()));
}
// ์์น(L) ๊ธฐ์ค ์ ๋ ฌ
Collections.sort(columnList, new Comparator<LH>() {
@Override
public int compare(LH o1, LH o2) {
// TODO Auto-generated method stub
Integer L1 = (Integer) o1.getL();
Integer L2 = (Integer) o2.getL();
return L1.compareTo(L2);
}
});
// ๋ค๊ฐํ ๋ฉด์ ์ถ๋ ฅ
System.out.println(calcPolygon(numberOfColumn, columnList));
}
static int calcPolygon(int numberOfColumn, List<LH> columnList) {
// ๋ณ์ ์ธํ
int startH = columnList.get(0).getH(); // ์์ ๋์ด
int endH = columnList.get(numberOfColumn - 1).getH(); // ๋ ๋์ด
int area = 0; // ๋ค๊ฐํ ๋์ด
// ๋์ด ์ต๋๊ฐ์ ๊ธฐ์ค์ผ๋ก ์ผ์ชฝ, ์ค๋ฅธ์ชฝ์ ๋๋ ๊ฒ
List<Integer> Hlist = new ArrayList<>();
int maxH = 0;
for (int i = 0; i < numberOfColumn; i++) {
Hlist.add(columnList.get(i).getH());
if (maxH < columnList.get(i).getH()) {
maxH = columnList.get(i).getH();
}
}
// ๋์ด ์ต๋๊ฐ ์ธ๋ฑ์ค (์ฌ๋ฌ ๊ฐ์ผ ์๋ ์์ผ๋ ์ต์, ์ต๋)
int index = Hlist.indexOf(maxH);
int lastIndex = Hlist.lastIndexOf(maxH);
// ์์๊ฐ - ์ต๋๊ฐ ์ฌ์ด์ ์๋ ๊ฐ ๊ณ ๋ฅด๊ธฐ
// ์ต๋๊ฐ์ผ๋ก๋ถํฐ ์ผ์ชฝ ์์ญ, ์ปค์ง๋ ๊ฐ
List<LH> leftList = new ArrayList<>();
int temp = startH;
for (int i = 0; i < index + 1; i++) {
LH current = columnList.get(i);
if (temp < current.getH()) {
temp = current.getH();
}
if ((current.getH() >= startH) && (current.getH() <= maxH)) {
if (temp <= current.getH()) {
leftList.add(current);
}
}
}
// ์ผ์ชฝ ๋์ด ๊ตฌํ๊ธฐ
for (int i = 0; i < leftList.size() - 1; i++) {
area += ((leftList.get(i + 1).getL() - leftList.get(i).getL()) * leftList.get(i).getH());
}
// ์ต๋๊ฐ ๊ณ ๋ฅด๊ธฐ
List<LH> maxList = new ArrayList<>();
for (int i = index; i < lastIndex + 1; i++) {
LH current = columnList.get(i);
if (current.getH() == maxH) {
maxList.add(current);
}
}
// ์ต๋๊ฐ ๋์ด ๊ตฌํ๊ธฐ (ํ๋์ผ ๊ฒฝ์ฐ *1, ์ฌ๋ฌ ๊ฐ์ผ ๊ฒฝ์ฐ ๊ทธ ๋์ด๋งํผ)
if (maxList.size() == 1) {
area += (1 * maxList.get(0).getH());
} else {
area += (((maxList.get(maxList.size() - 1).getL() + 1) - maxList.get(0).getL()) * maxList.get(0).getH());
}
// ์ต๋๊ฐ - ๋๊ฐ ์ฌ์ด์ ์๋ ๊ฐ ๊ณ ๋ฅด๊ธฐ
List<LH> rightList = new ArrayList<>();
temp = endH;
for (int i = lastIndex; i < numberOfColumn; i++) {
LH current = columnList.get(i);
if (temp > current.getH()) {
temp = current.getH();
}
if ((current.getH() >= endH) && (current.getH() <= maxH)) {
if (temp <= current.getH()) {
rightList.add(current);
}
}
}
// ์ค๋ฅธ์ชฝ ๋์ด ๊ตฌํ๊ธฐ
for (int i = 0; i < rightList.size() - 1; i++) {
area += (((rightList.get(i + 1).getL() + 1) - (rightList.get(i).getL() + 1)) * rightList.get(i + 1).getH());
}
return area;
}
}
class LH {
private int L;
private int H;
public LH(String text) {
super();
String[] temp = text.split(" ");
L = Integer.parseInt(temp[0]);
H = Integer.parseInt(temp[1]);
}
public int getL() {
// TODO Auto-generated method stub
return L;
}
public int getH() {
// TODO Auto-generated method stub
return H;
}
@Override
public String toString() {
// TODO Auto-generated method stub
return "LH [L=" + L + ", H=" + H + "]\n";
}
}
์ฝ๋๋ฅผ ์ง๋ค๋ณด๋ ์๊ฐํ๋๋ก ํ๊ธฐ์๋ ์ฝ๊ฐ ๋ฌด๋ฆฌ๊ฐ ์๋ ๊ฒ ๊ฐ์ด ๋๊ปด์ก๋ค.
ํจ์ฌ ๊ฐ๋จํ ์ฝ๋๊ฐ ๋ง๊ธฐ๋ ํด์ ์ฐพ์์ ์ฝ์ด๋ดค๋๋ฐ ์ ๊ทผ๋ฒ์ ๋น์ทํ๋ค.
์ผ์ชฝ, ๊ฐ์ด๋ฐ, ์ค๋ฅธ์ชฝ์ ๋ฐ๋ก ๋๋ ์ ๊ณ์ฐํ๋ ๊ฒ๋ณด๋ค๋ ์ผ์ชฝ์์ ์ค๋ฅธ์ชฝ์ผ๋ก ๊ฐ๋ค๊ฐ ์ต๋๊ฐ์์ ์ค๋จ, ๊ทธ๋ฆฌ๊ณ ๋ฐ๋๋ก ์ค๋ฅธ์ชฝ์์ ์ผ์ชฝ์ผ๋ก ๊ฐ๋ค๊ฐ ์ต๋๊ฐ์์ ์ค๋จํ๋ ๋ฐฉ์์ผ๋ก ์ฝ๋๋ฅผ ์์ ํด๋ด๋ ์ข์ ๊ฒ ๊ฐ๋ค.
'๊ฐ๋ฐ > ์๋ฃ๊ตฌ์กฐ & ์๊ณ ๋ฆฌ์ฆ' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
์คํ์ฑํ ๋ฐฉ (Java) (0) | 2021.10.24 |
---|---|
๋ก๋์ ์ต๊ณ ์์์ ์ต์ ์์ (Java) (0) | 2021.10.24 |
์ ๊ท ์์ด๋ ์ถ์ฒ (Java) (0) | 2021.10.24 |
์ค์ฒฉ ๋ฐ๋ณต๋ฌธ ๋์ฒดํ๊ธฐ (0) | 2021.10.14 |
1๋ถํฐ n๊น์ง์ ํฉ์ ๋ฐํํ๋ ์๊ณ ๋ฆฌ์ฆ (0) | 2021.10.13 |
๋๊ธ