ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [백준] 2477번 : 참외밭 - 자바(JAVA)
    알고리즘/백준 2022. 4. 13. 00:01
    반응형

    https://www.acmicpc.net/problem/2477

     

    2477번: 참외밭

    첫 번째 줄에 1m2의 넓이에 자라는 참외의 개수를 나타내는 양의 정수 K (1 ≤ K ≤ 20)가 주어진다. 참외밭을 나타내는 육각형의 임의의 한 꼭짓점에서 출발하여 반시계방향으로 둘레를 돌면서 지

    www.acmicpc.net

     

    문제 해석

    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);
    
    	}
    
    }

     

    댓글

Designed by Tistory.