PS/정렬 알고리즘[Sort]

백준 2628 종이자르기(c++)

SeungbeomKim 2022. 8. 23. 23:25

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

 

2628번: 종이자르기

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

www.acmicpc.net

<코드>

#include <iostream>
#include <algorithm>
#include <vector>
using namespace std;

int main()
{
	int n,m,t;
	cin>>n>>m;
	cin>>t; // 자르는 횟수
	vector<int>width(n); // 가로 
	vector<int>length(m); // 세로  
	for(int i=0;i<t;i++)
	{
		int a,b;
		cin>>a>>b;
		if(a==0) length.push_back(b);
		if(a==1) width.push_back(b);
	}
	width.push_back(n);
	length.push_back(m);
	sort(length.begin(),length.end());
	sort(width.begin(),width.end());
	int result =0;
	if(length.size()==1 && width.size()>1)
	{
		for(int j=1;j<width.size();j++)
		{
			if(length[0] * (width[j]-width[j-1])>result){
				result = length[0] * (width[j]-width[j-1]);
			}
		}
			cout<<result;	
	}
	else if(length.size()>1 && width.size()>1){
	for(int i=1;i<length.size();i++)
	{
		for(int j=1;j<width.size();j++)
		{
			if((length[i]-length[i-1])*(width[j]-width[j-1])>result){
				result = (length[i]-length[i-1])*(width[j]-width[j-1]);
			}
		}
	}
		cout<<result;
	}
	else if(length.size()>1 && width.size()==1)
	{
		for(int j=1;j<length.size();j++)
		{
			if(width[0] * (length[j]-length[j-1])>result){
				result = length[0] * (width[j]-width[j-1]);
			}
		}
		cout<<result;
	}
	else{
		cout<<width[0]*length[0];
	}
	
	
}

<풀이과정>

잘린 가로의 길이의 최대 * 잘린 세로의 길이의 최대 => 최대 사각형의 넓이 

그렇지만 가로와 세로가 잘리지 않은 경우도 고려해야 되기 때문에, if문을 통해 각 조건을 나누어주었다.

1.length.size()==1 && width.size()>1 =>가로 한번이상 자르고, 세로 자르지 않음

2.length.size()>1 && width.size()>1 => 가로 한번이상 자르고, 세로 한 번 이상 자름

3.length.size()>1 && width.size()==1 => 세로 한번이상 자르고, 가로 자르지 않음

4.else => 둘 다 자르지 않음

'PS > 정렬 알고리즘[Sort]' 카테고리의 다른 글

백준 10825 국영수(c++)  (0) 2022.08.26
백준 1377 버블소트(c++)  (0) 2022.08.26
백준 11652 카드(c++)  (0) 2022.08.19
백준 2805 나무 자르기(c++)  (0) 2022.07.18
백준 2776 암기왕(c++)  (0) 2022.07.18