https://www.acmicpc.net/problem/2477
백준 2477번 참외밭 문제 링크입니다.
핵심
반드시 육각형이고, 시계 반대방향으로 돌아간다. 우리는 가장 큰 가로변과 세로 변을 구하여 가장 바깥쪽의 직사각형을 구하고 그 직사각형에서 작은 직사각형이 잘린 크기를 구할 것이다.
정답 코드
import java.util.Scanner;
public class Main {
public static void main(String[] args){
Scanner sc = new Scanner(System.in);
int K =sc.nextInt();
int[][] arr = new int[6][2];
int width_index=0;
int height_index=0;
int width_max=0;
int height_max=0;
for(int i=0;i<6;i++) {
arr[i][0]=sc.nextInt();
arr[i][1]=sc.nextInt();
}
for(int i=0;i<6;i++) {
if(arr[i][0]==1 || arr[i][0]==2) {
if(width_max<arr[i][1]) {
width_max=arr[i][1];
width_index=i;
}
}
else if(arr[i][0]==3 || arr[i][0]==4) {
if(height_max<arr[i][1]) {
height_max=arr[i][1];
height_index=i;
}
}
}
int W=0,H=0;
if(width_index==0)H = Math.abs(arr[5][1]-arr[1][1]);
else if(width_index==5)H = Math.abs(arr[4][1]-arr[0][1]);
else H = Math.abs(arr[width_index+1][1]-arr[width_index-1][1]);
if(height_index==0)W = Math.abs(arr[5][1]-arr[1][1]);
else if(height_index==5)W= Math.abs(arr[4][1]-arr[0][1]);
else W = Math.abs(arr[height_index+1][1]-arr[height_index-1][1]);
System.out.println((width_max*height_max-W*H)*K);
}
}
해설
2차원 배열을 선언해주고, 처음에는 동서남북 값을 두 번째는 길이를 넣어준다.
가로와 세로를 나누어서 구분해준다. 동은 1 서는 2 남은 3 북은 4의 값을 가진다.
따라서 동, 서쪽이 가로이고, 이 중에 최대길이의 값을 width_max에 넣고, 그때의 위치를 width_index에 넣는다.
남, 북쪽은 세로가 되고, 이 중에서 최대 길이의 값을 height_max에 넣고, 그때의 위치를 height_index에 넣는다.
W는 가로길이 H는 세로 길이를 나타내 주기 위해 선언하였다.
최대의 가로길이를 가진 위치 바로 옆에 있는 세로의 최대길이와 다른 세로 길이를 빼주면, 작은 직사각형의 세로 길이를 구할 수 있다.
반대로 최대의 세로 길이를 가진 위치 바로 옆에 있는 가로의 최대길이와 다른 가로길이를 빼주면, 작은 직사각형의 가로길이를 구할 수 있다.
이 두 값을 곱하면 우리가 원하는 작은 직사각형 넓이를 구할 수 있다.
이제 큰 직사각형-작은 직사각형을 하면 전체 면적을 구할 수 있다. 이후 참외의 개수 K를 곱하면 된다.
개선점이나 오류가 있다면, 댓글 부탁드립니다.
'PS > 알고리즘 문제풀이' 카테고리의 다른 글
[백준]15649번 N과 M(1) (java) (0) | 2022.07.15 |
---|---|
[백준]1002번 터렛(java) (0) | 2022.07.13 |
[백준]7568번 덩치(java) (1) | 2022.07.12 |
[백준]2981번 검문(java) (0) | 2022.07.11 |
[백준]10816번 숫자 카드2(java) (0) | 2022.07.10 |