2304๋ฒ: ์ฐฝ๊ณ ๋ค๊ฐํ
์ฒซ ์ค์๋ ๊ธฐ๋ฅ์ ๊ฐ์๋ฅผ ๋ํ๋ด๋ ์ ์ N์ด ์ฃผ์ด์ง๋ค. N์ 1 ์ด์ 1,000 ์ดํ์ด๋ค. ๊ทธ ๋ค์ N ๊ฐ์ ์ค์๋ ๊ฐ ์ค์ ๊ฐ ๊ธฐ๋ฅ์ ์ผ์ชฝ ๋ฉด์ ์์น๋ฅผ ๋ํ๋ด๋ ์ ์ L๊ณผ ๋์ด๋ฅผ ๋ํ๋ด๋ ์ ์ H๊ฐ ํ ๊ฐ์
www.acmicpc.net
๋ฌธ์ ์กฐ๊ฑด์ ์ฝ์ด๋ณด๋ฉด '์ง๋ถ์ ์ด๋ ๋ถ๋ถ๋ ์ค๋ชฉํ๊ฒ ๋ค์ด๊ฐ ๋ถ๋ถ์ด ์์ด์ผ ํ๋ค.'๋ผ๋ ์กฐ๊ฑด์ด ์๋ค. ์ด ์กฐ๊ฑด์ ์ปค์ก๋ค ์์์ก๋ค ๋ค์ ์ปค์ง ์ ์๋ค๋ ๋ง์ด๊ณ , ๊ทธ๋ฌ๋ ค๋ฉด ๊ฐ์ฅ ์ปค์ง๋ ์ต๋ ์ง์ ์ด ์ด๋์ง ์์์ผ ํ๋ค.
์ฒ์ ์๊ฐ๋ฌ๋ ๊ฑด ์ผ์ชฝ โ ์ค๋ฅธ์ชฝ์ผ๋ก ๋ฐ๋ณต์ ๋๋ฉด์ ์ด์ ๋ณด๋ค ํฐ ๊ฐ, ๋๋ ์์ ๊ฐ์ ๋ถ๋ฅํด์ ๊ตฌ๋ถํด๋ผ ์์ ์ด์์ผ๋ ๊ฐ์ฅ ์ปค์ง๋ ์ง์ ์ด ์ด๋์ง ๋ชฐ๋ผ์ ๊ตฌํํ ์ ์์๋ค.
๊ทธ๋์ ์๊ฐํด๋ธ ๋ฐฉ๋ฒ์ ๊ฐ์ฅ ๋์ ๊ธฐ๋ฅ์ ๊ธฐ์ค์ผ๋ก ์ผ์ชฝ, ์ค๋ฅธ์ชฝ์ผ๋ก ๊ฐ ์๋ก ์ ์ ๋์ด๊ฐ ์์์ ธ์ผ ํ๋ค.
์๋ฅผ ๋ค์ด, ์ฃผ์ด์ง ํ
์คํธ ์ผ์ด์ค์์ ๊ฐ์ฅ ๋์ด๊ฐ ๋์ (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 |
๋๊ธ