뮁이의 개발새발

[JAVA] 백준 2628 종이자르기 본문

Algorithm

[JAVA] 백준 2628 종이자르기

뮁뮁이 2021. 8. 29. 20:51

원래 배열에 점선부분을 다 1로 변경해서 할까 생각했는데, 어차피 좌표끼리 비교하는거면 그냥 배열 굳이 안만들고 좌표만 저장해놓고 비교해도 될것 같았다.

그래서 리스트를 세로용, 가로용 두개 만들어서 좌표를 다 추가해주고, 시작점인 0과 끝점인 가로 세로 길이도 넣어주었다. 그리고 오름차순으로 소트하고, 반복문 가로용 세로용 두번 돌면서 각 좌표간의 차이의 최대값을 구해서 그 둘이 곱한 값을 출력해줬음 ㅎ 효율이 좋은편인지는 모르겠다... 풀면 장땡

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

public class bj2628 {
	public static void main(String[] args) throws NumberFormatException, IOException {
		BufferedReader in = new BufferedReader(new InputStreamReader(System.in));

		StringTokenizer st = new StringTokenizer(in.readLine());
		int w = Integer.parseInt(st.nextToken());
		int h = Integer.parseInt(st.nextToken());

		int N = Integer.parseInt(in.readLine());

		LinkedList<Integer> listx = new LinkedList<Integer>();
		LinkedList<Integer> listy = new LinkedList<Integer>();

		for (int i = 0; i < N; i++) {
			st = new StringTokenizer(in.readLine());
			int path = Integer.parseInt(st.nextToken());
			int point = Integer.parseInt(st.nextToken());

			if (path == 0) {
				listx.add(point);
			}
			if (path == 1) {
				listy.add(point);
			}
		}

		listx.add(h);
		listx.add(0);
		listy.add(w);
		listy.add(0);

		listx.sort(null);
		listy.sort(null);

		int max_x = 0;
		for (int i = listx.size() - 1; i > 0; i--) {
			int temp = listx.get(i) - listx.get(i - 1);
			if (max_x < temp) {
				max_x = temp;
			}
		}

		int max_y = 0;
		for (int i = listy.size() - 1; i > 0; i--) {
			int temp = listy.get(i) - listy.get(i - 1);
			if (max_y < temp) {
				max_y = temp;
			}
		}

		System.out.println(max_x * max_y);
	}
}
Comments