컴공댕이 공부일지

[java] 백준 ( 2477 참외밭 ) 💥💦 본문

문제 풀이/코딩 문제 풀이 모음

[java] 백준 ( 2477 참외밭 ) 💥💦

은솜솜솜 2023. 4. 5. 20:14
728x90

2477 참외밭

실버 2

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

 

2477번: 참외밭

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

www.acmicpc.net

 

시험기간이라 바쁘지만 학교 공부하기 시러서 스트릭 잇기...ㅎ

오토마타 객지프 디논설 이산수학 소융창 수치해석이 날 기다리므로 빠르게 한 문제만 리뷰해보겠다.

 

 

 

[ 정답코드 ]

import java.util.Scanner;

public class P참외밭 {
	public static void main(String[] args) {
		
		Scanner s = new Scanner(System.in);
		
		int k=s.nextInt();
		int max0=0;
		int max1=0;
		int [][] arr = new int[2][6]; //길이와 가로세로 정보를 입력할 이차원 배열
		for(int i=0; i<6; i++) {
			int dr = s.nextInt();
			
			if(dr==1 || dr==2) {
				arr[0][i] = 0; //가로 방향 이동이면 1행에 0저장
			} else {
				arr[0][i] = 1; //세로 방향 이동이면 1행에 1저장
			}
			
			arr[1][i]=s.nextInt(); //2행에는 길이값 저장
		}
		
        //제대로 입력됐나 확인하기
		for(int i=0; i<6; i++) {
			System.out.print(arr[0][i]+" ");
		}System.out.println();
		for(int i=0; i<6; i++) {
			System.out.print(arr[1][i]+" ");
		}System.out.println();
		
        
		//가로, 세로의 최댓값 찾기
		int index0=0;
		int index1=1;
		for(int i=0; i<3; i++) {
			max0=arr[1][0];
			if(max0<arr[1][2]) {
				max0=arr[1][2];
				index0=2;
			}
			if (max0<arr[1][4]) {
				max0=arr[1][4];
				index0=4;
			}
			
			max1=arr[1][1];
			if(max1<arr[1][3]) {
				max1=arr[1][3];
				index1=3;
			}
			if (max1<arr[1][5]) {
				max1=arr[1][5];
				index1=5;
			}
		}
		
        
        //최댓값이랑 그때의 인덱스 잘 찾았는지 확인
		System.out.println("max0:"+max0+" / max1:"+max1);
		System.out.println("index0:"+index0+" / index1:"+index1);
		
        
		int aU=max0*max1; //큰 사각형의 넓이
		int aSub=0; //빼야하는 작은 사각형의 넓이
	
    
		//작은 사각형 넓이 구하기
		index0+=3;
		index0%=6;
		int a=arr[1][index0];
		
		index1+=3;
		index1%=6;
		int b=arr[1][index1];
		
		aSub=a*b;
		
        
        
		System.out.println((aU-aSub)*k);
		
	}

}

 

 

 

기하는 항상 문제 풀이는 수학적으로 너무 쉬운데..

이걸 컴퓨터로 구현하는 과정이 헷갈린다. 그래서 어떻게 풀까 방향 잡는데 좀 걸렸다.

 

처음엔 단순히 육각형을 사각형으로 쪼갈라서 문제를 푸는 법을 고민했으나...

풀이법이 잘 보이지 않아 큰 넓이에서 해당안되는 부분을 빼는 것으로 방향을 잡았다.

 

문제 풀 때 쓴 필기...ㅎㅅㅎ

 

 

[ 풀이 ]

ㄱ,ㄴ 등의 모양으로 꺾인 육각형의 넓이를 구해야하므로

큰 직사각형(aU)에서 해당되지 않는 작은 직사각형의 넓이(aSub)를 빼기로 했다.

answer = (aU - aSub) * k

728x90
Comments