-
[백준] 2477번 : 참외밭 - 자바(JAVA)알고리즘/백준 2022. 4. 13. 00:01
https://www.acmicpc.net/problem/2477
문제 해석
6 각형 참외밭의 면적을 구하여 참외의 수를 구하라
문제 풀이 전 설계
방향이 주어지기 때문에 모든 점의 좌표계를 구하여 내부에 있는 점을 확인하고 차이를 계산하여 면적을 구하려고 했습니다.
그러다가 가장 큰 길이를 기준으로 탐색해나가는 방식으로 넓이를 구하는것으로 바꾸었습니다.
1. 우선 가장 긴 길이를 찾습니다. (160)
2. 160 인덱스를 기준으로 양옆에 큰 값을 구합니다 (50)
3. 큰 사각형의 면적이 나왔습니다 (가장 긴 길이 * 가장 긴 길이 양옆의 큰 값)
4. 또한 160 인덱스를 기준으로 양옆의 큰 값 - 작은 값을 하면 50- 30으로 = 20 작은 사각형의 길이 하나를 구할 수 있습니다.
큰 사각형의 면적에 작은 사각형의 면접을 빼주어야 합니다.
4. 인덱스를 기준으로 양옆에 큰 값을 구했던 50을 재사용합니다.
5. 50의 양옆에서 160을 제외한 길이를 찾고 160- 100을 해주면 또 다른 작은 사각형의 길이인 60을 얻을 수 있습니다.
코드
import java.io.BufferedReader; import java.io.IOException; import java.io.InputStreamReader; import java.util.Arrays; import java.util.StringTokenizer; public class Main_2477_참외밭 { static final int ANGLE = 6; public static void main(String[] args) throws NumberFormatException, IOException { BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); // K = 1m^2 넓이에 자라는 참외의 개수 int K = Integer.parseInt(br.readLine()); int[] sizeArray = new int[6]; for (int i = 0; i < ANGLE; i++) { StringTokenizer st = new StringTokenizer(br.readLine(), " "); Integer.parseInt(st.nextToken()); // 방향 필요없음 int size = Integer.parseInt(st.nextToken()); sizeArray[i] = size; } // 가장 큰 길이를 찾음 int maxValue = Integer.MIN_VALUE; for (int i = 0; i < ANGLE; i++) { maxValue = Math.max(maxValue, sizeArray[i]); } // 가장 큰 길이의 index를 찾음 int longestIndex = 0; for (int i = 0; i < ANGLE; i++) { if (sizeArray[i] == maxValue) { longestIndex = i; } } // 가장 큰 길이의 index의 양옆중에 큰값과 작은값을 찾음 int leftIndex = longestIndex >= 1 ? longestIndex - 1 : 5; int rightIndex = longestIndex < 5 ? longestIndex + 1 : 0; int bigValue = Math.max(sizeArray[leftIndex], sizeArray[rightIndex]); int smallValue = Math.min(sizeArray[leftIndex], sizeArray[rightIndex]); // 가장 큰 길이의 index 양옆중 큰값의 index int bigIndex = sizeArray[leftIndex] > sizeArray[rightIndex] ? leftIndex : rightIndex; // 큰 사각형 면적 구하기 int bigRectangleArea = maxValue * bigValue; int bigsLeftIndex = bigIndex >= 1 ? bigIndex - 1 : 5; int bigsRightIndex = bigIndex < 5 ? bigIndex + 1 : 0; int findValue = 0; if (sizeArray[bigsLeftIndex] == maxValue) { findValue = sizeArray[bigsRightIndex]; } if (sizeArray[bigsRightIndex] == maxValue) { findValue = sizeArray[bigsLeftIndex]; } // 작은 사각형 면적 구하기 int smallRectangleArea = (bigValue - smallValue) * (maxValue - findValue); System.out.println((bigRectangleArea - smallRectangleArea) * K); } }
'알고리즘 > 백준' 카테고리의 다른 글
[백준] 24512번 : Bottleneck Travelling Salesman Problem(Small) - 자바(JAVA) (0) 2022.04.16 [백준] 10026번 : 적록색약 - 자바(JAVA) (0) 2022.04.14 [백준] 15686번 : 치킨 배달 - 자바(JAVA) (0) 2022.04.12 [백준] 14719번 : 빗물 - 자바(JAVA) (0) 2022.04.10 [백준] 1759번 : 암호 만들기 - 자바(JAVA) (0) 2022.04.07