[BJ2628] 종이 자르기
✏️ 𝗔𝗹𝗴𝗼𝗿𝗶𝘁𝗵𝗺/백준 알고리즘

[BJ2628] 종이 자르기

 

 백준 - 종이 자르기 

문제 링크

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

 

2628번: 종이자르기

아래 <그림 1>과 같이 직사각형 모양의 종이가 있다. 이 종이는 가로방향과 세로 방향으로 1㎝마다 점선이 그어져 있다. 가로 점선은 위에서 아래로 1번부터 차례로 번호가 붙어 있고, 세로 점선

www.acmicpc.net

 

문제 입출력 1

10 8
3
0 3
1 4
0 2
30

문제 입출력 2

10 10
1
0 1
90

 

문제 풀이

package problem.BJ;


import java.io.BufferedReader;
import java.io.FileInputStream;
import java.io.InputStreamReader;
import java.util.ArrayList;
import java.util.Collections;
import java.util.StringTokenizer;


public class BJ2628_종이자르기 {
	static int W, H, N;
	static int P = 2;
	static int minW, minH, maxW, maxH;
	static ArrayList<Integer> ws = new ArrayList<>();
	static ArrayList<Integer> hs = new ArrayList<>();


	// 슬라이딩 윈도우 사용
	private static void solve() {
		// 처음 두 개의 값을 구한다. (빼기의 값)
		for (int i = 0; i < P; i++) {
			minW = Math.abs(minW - hs.get(i));
			minH = Math.abs(minH - ws.get(i));
		}

		// 여기서도 한번 확인해야한다.
		maxW = Math.max(maxW, minW);
		maxH = Math.max(maxH, minH);

		// 슬라이딩 윈도우 기법을 사용해서 더하고 뺀다.
		// 그 값들 중에서 최댓값을 찾는다.
		for (int i = P; i < hs.size(); i++) {
			minW = Math.abs(minW + hs.get(i - P));
			minW = Math.abs(minW - hs.get(i));

			maxW = Math.max(maxW, minW);
		}

		for (int i = P; i < ws.size(); i++) {
			minH = Math.abs(minH + ws.get(i - P));
			minH = Math.abs(minH - ws.get(i));

			maxH = Math.max(maxH, minH);

		}

	}


	public static void main(String[] args) throws Exception {
		System.setIn(new FileInputStream("input.txt"));
		BufferedReader br = new BufferedReader(new InputStreamReader(System.in));

		// 변수 입력
		StringTokenizer st = new StringTokenizer(br.readLine());
		W = Integer.parseInt(st.nextToken());
		H = Integer.parseInt(st.nextToken());
		N = Integer.parseInt(br.readLine());

		// 종이의 끝과 끝 범위 추가
		ws.add(0);
		ws.add(H);
		hs.add(0);
		hs.add(W);

		// 점선 입력
		for (int i = 0; i < N; i++) {
			st = new StringTokenizer(br.readLine());
			int opt = Integer.parseInt(st.nextToken());

			if (opt == 0) ws.add(Integer.parseInt(st.nextToken()));
			else hs.add(Integer.parseInt(st.nextToken()));
		}

		// 정렬
		Collections.sort(ws);
		Collections.sort(hs);

		solve();

		// 출력
		System.out.println(maxW * maxH);

	} // end main
}

슬라이딩 윈도우 기법을 사용하여 O(N) 에 시간에 해결.

 

 

 

 

 

 

 

 

 

# 백준 종이 자르기 java # 백준 종이 자르기 자바


 

728x90

'✏️ 𝗔𝗹𝗴𝗼𝗿𝗶𝘁𝗵𝗺 > 백준 알고리즘' 카테고리의 다른 글

[BJ2667] 단지 번호 붙이기  (0) 2022.09.05
[BJ2606] 바이러스  (0) 2022.09.04
[BJ12493] 탑  (0) 2022.08.08
[BJ2023] 신기한 소수  (0) 2022.08.08
[BJ12891] DNA 비밀번호  (0) 2022.08.08