생각
처음엔 방향을 고려하지 않고 큰 직사각형에서 작은 직사각형을 빼서 넓이를 구하자고 생각했습니다. 현재 방향인 dir[i] 와 dir[(i+2)%6]이 같다면 dir[(i+1)%6]이 방향값에 따라 작은 직사각형의 가로나 세로일것이다라고 구현했습니다. 하지만 이러한 방식은 참외밭이 회전할 경우에는 작은 직사각형의 가로나 세로를 구할수가없습니다.
따라서 꺾인 부분을 체크할때 직전 방향값과 다음방향값이 같을때 현재 길이값이 작은 직사각형의 가로or세로입니다.
int beforeDir = (i+5)%6;
int nextDir = (i+1)%6;
if(dir[beforeDir] == dir[nextDir]) { //직전 방향과 다음방향값이 같을때 i가 작은 직사각형의 가로 or 세로 }
이러한 방향 특징을 가진곳이 두개가 나오므로 작은 직사각형의 넓이를 구하면 됩니다.
다음으로 큰 직사각형의 가로와 세로는 입력받은 값들중 방향에 따라서 가장 큰값을 찾으면 됩니다.
Java code
package com.java.algorithm;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.StringTokenizer;
public class Baekjoon_2477_참외밭 {
public static void main(String[] args) throws NumberFormatException, IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
int N = Integer.parseInt(br.readLine());
int[] arr = new int[6];
int[] dir = new int[6];
int heightMax = Integer.MIN_VALUE, widthMax = Integer.MIN_VALUE;
int heightMin = Integer.MAX_VALUE, widthMin = Integer.MAX_VALUE;
for (int i = 0; i < 6; i++) {
StringTokenizer st = new StringTokenizer(br.readLine(), " ");
int d = Integer.parseInt(st.nextToken());
int val = Integer.parseInt(st.nextToken());
dir[i] = d;
arr[i] = val;
if(d== 1 || d== 2) {
widthMax = Math.max(widthMax, val);
}
else{
heightMax = Math.max(heightMax, val);
}
}
for (int i = 0; i < 6; i++) {
//꺽이는지점
//동서남북 1234
int beforeDir = (i+5)%6;
int nextDir = (i+1)%6;
if(dir[beforeDir] == dir[nextDir]) {
if(dir[i] == 1 || dir[i] == 2) {
widthMin = arr[i];
}else {
heightMin = arr[i];
}
}
}
int ans = N*(heightMax*widthMax - heightMin*widthMin);
System.out.print(ans);
}
}
'Algorithm' 카테고리의 다른 글
[백준] JAVA - 10157.자리배정 (0) | 2021.03.11 |
---|---|
[백준] JAVA - 2491.수열 (0) | 2021.03.08 |
[백준] JAVA - 2304.창고 다각형 (0) | 2021.03.07 |
[백준] Python - 1713.후보 추천하기 (0) | 2021.03.06 |
[백준] JAVA - 1920.수 찾기 (0) | 2021.03.06 |