알고리즘

[boj2477/Java] 참외밭

IT 참다랑어 2023. 7. 20. 14:21

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

 

2477번: 참외밭

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

www.acmicpc.net

문제를 푸는데 있어서 필요한 것은 사각형의 넓이를 구하기 위해서 도대체 어디가 안으로 들어가 있는 부분의 길이인가를 구하는 것이라고 생각했다. 한시간 이상 고민하다가 안되서 다른 풀이를 읽어보고 다시한번 최적화해봤다.

 

문제를 읽어봤을 때 방향과 길이를 줄 때 출발지는 랜덤이긴 하지만 연속된 모서리를 돌기 때문에 index 상에서 동서 방향 옆에는 항상 남북 방향이 온다. 그리고 가로 방향 중 가장 큰 값이 큰 사각형의 가로 값(wMax)이 되고, 세로도 마찬가지로 가장 큰 값이 큰 사각형의 세로 값(hMax)이 된다. 또한 wMax와 hMax는 항상 바로 옆에 위치되어 있다.

 

따라서 wMax옆에 있지만 hMax가 아닌 다른 한 변의 길이를 hMax에서 빼면 작은 사각형의 세로(hMin)가 되고 wMin도 같은 방법으로 구할 수 있다.

 

마지막으로 큰 사각형에서 작은 사각형을 빼면 육각형의 넓이를 구할 수 있다.

코드는 다음과 같다.

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.StringTokenizer;

public class Main {

public static void main(String[] args) throws NumberFormatException, IOException {

	BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
	StringTokenizer st;
	int N = Integer.parseInt(br.readLine());
	int[] dirList = new int[6];
	int[] distList = new int[6];
	int d, l, widx = -1, hidx = -1, wMax = -1, hMax = -1;
	
	for(int i = 0; i<6; i++) {
		st = new StringTokenizer(br.readLine());
		d = Integer.parseInt(st.nextToken());
		l = Integer.parseInt(st.nextToken());
		dirList[i] = d;
		distList[i] = l;
		if(d == 1 || d == 2) {
			if(hMax < l) {
				hMax = l;
				hidx = i;
			}
		}else {
			if(wMax < l) {
				wMax = l;
				widx = i;
			}
		}		
	}
	
	int wMin = wMax - (((hidx+1)%6 == widx)? distList[(hidx-1+6)%6]:distList[(hidx+1)%6]);
	int hMin = hMax - (((widx+1)%6 == hidx)? distList[(widx-1+6)%6]:distList[(widx+1)%6]);
    
	System.out.println((wMax * hMax - wMin * hMin)*N);
}

}

 

'알고리즘' 카테고리의 다른 글

[boj5397/Java] 키로거(Stack)  (0) 2023.07.24
[boj13335/Java] 트럭(Queue 사용법)  (0) 2023.07.24
[boj3474/JAVA] 교수가 된 현우  (0) 2023.07.20
[boj2607/Java] 비슷한 단어  (0) 2023.07.17
[boj6884/Java] 소수 부분 수열  (0) 2023.07.17