본문 바로가기
온라인 저지/BOJ

[BOJ/Java] 2477 참외밭

by ahj 2022. 2. 20.
import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.util.ArrayDeque;
import java.util.StringTokenizer;

public class BOJ2477 {

	public static void main(String[] args) throws Exception {
		BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
		int k = Integer.parseInt(br.readLine());
		StringTokenizer st;

		// dir, len
		int[] maxC = new int[] { 0, 0 };
		int[] maxR = new int[] { 0, 0 };
		ArrayDeque<int[]> q = new ArrayDeque<>();
		for (int i = 0; i < 6; i++) {
			st = new StringTokenizer(br.readLine());
			// 1-우, 2-좌, 3-하, 4-상
			int dir = st.nextToken().charAt(0) - '0';
			int len = Integer.parseInt(st.nextToken());
			int[] tmp = new int[] { dir, len };
			switch (dir) {
			// 좌우 방향일때 dir과 longest 기억
			case 1:
			case 2:
				if (len > maxC[1]) {
					maxC = tmp;
				}
				break;
			// 상하 방향일때 dir과 longest 기억
			case 3:
			case 4:
				if (len > maxR[1]) {
					maxR = tmp;
				}
				break;
			}
			q.add(tmp);
		}
		int minusArea = 0;
		// longest 다음 다음 같은 방향일때부터 세어주면 된다
		// 이부분을 좀 무식하게 구현해준 것 같다..
		// max변 각각에 대해서 다른 max변이 아닌 다음 다음 변, 그 다음 변이 뺄 면적 값을 구해줄 수 있는 변이다.
		while (true) {
			int[] compare = q.poll();
			// 꺼내준 값이 max 변 중 하나라면
			if (compare.equals(maxR) || compare.equals(maxC)) {
				// 한번 더 꺼낸다.
				int[] tmp = q.poll();
				// 꺼낸 값이 또 max라면 한번 더 지나가기 위해 poll 해준다.
				if (tmp.equals(maxR) || tmp.equals(maxC)) {
					q.poll();
				}
				// 다음 poll값부터는 뺄 면적의 변 둘이다.
				minusArea = q.poll()[1] * q.poll()[1];
				break;
			}
			// circular queue처럼 사용하기 위해 다시 add 해주기
			q.add(compare);
		}
		int answer = k * ((maxR[1] * maxC[1]) - minusArea);
		System.out.println(answer);
	}
}

더 간단하게 짧은 변을 구해줄 수 있었을 것 같은데, 뭔가 아쉽다. 아이디어를 떠올리는 시간이 왜 이리 오래 걸리는지

'온라인 저지 > BOJ' 카테고리의 다른 글

[BOJ/Java] 13300 방 배정  (0) 2022.02.20
[BOJ/Java] 10163 색종이  (0) 2022.02.20
[BOJ/Java] 14502 연구소  (0) 2022.02.18
[BOJ/Java] 9663 N-Queen  (0) 2022.02.18
[BOJ/Java] 1931 회의실 배정  (0) 2022.02.18

댓글