반응형

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

 

2173번: 양파깡 만들기

(주) 넝심에서는 양파링의 아성에 도전할 만한 아이디어 과자인 양파깡을 만들어냈다. 양파깡은 기존의 양파링과는 달리 직사각형의 모양을 갖는 과자이다. 그런데 (주) 넝심의 과자 기술은 그

www.acmicpc.net

 

먼저 과자판에서 각 좌표의 가로와 세로에 대한 누적합을 구해둡니다.

그리고 모든 좌표를 돌면서, 각 좌표에서 만들 수 있는 모든 양파깡의 맛 크기를 기억해줍니다.

맛 크기를 내림차순으로 정렬한 뒤, 순서대로 만들 수 있는 M개의 양파깡들을 구해줍니다.

 

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

int n, m, map[31][31], v[5];
int sw[31][31] = { 0 }, sh[31][31] = { 0 };
bool visit[31][31] = { false };
vector<vector<int>> arr, res;

void init() {
	for (int i = 1; i <= n; i++) {
		for (int j = 1; j <= n; j++) {
			sh[j][i] = sh[j - 1][i] + map[j][i];
			sw[i][j] = sw[i][j - 1] + map[i][j];
		}
	}
}

int getTaste(int x, int y, int height, int width) {
	return sh[x + height - 1][y] - sh[x - 1][y]
		+ sh[x + height - 1][y + width - 1] - sh[x - 1][y + width - 1]
		+ sw[x][y + width - 2] - sw[x][y]
		+ sw[x + height - 1][y + width - 2] - sw[x + height - 1][y];
}

bool chk(int x, int y, int height, int width) {
	for (int i = x; i < x + height; i++)
		if (visit[i][y] || visit[i][y + width - 1]) return false;
	for (int i = y + 1; i < y + width - 1; i++)
		if (visit[x][i] || visit[x + height - 1][i]) return false;
	return true;
}

void visitCheck(int x, int y, int height, int width) {
	for (int i = x; i < x + height; i++)
		visit[i][y] = visit[i][y + width - 1] = true;
	for (int i = y + 1; i < y + width - 1; i++)
		visit[x][i] = visit[x + height - 1][i] = true;
}

int main() {
	scanf("%d %d", &n, &m);
	for (int i = 1; i <= n; i++) 
		for (int j = 1; j <= n; j++) scanf("%d", &map[i][j]);
	init();
	for (int i = 1; i <= n; i++)
		for (int j = 1; j <= n; j++)
			for (int k = 3; k + i <= n + 1; k++)
				for (int l = 3; l + j <= n + 1; l++)
					arr.push_back({ -getTaste(i, j, k, l), i, j, k, l });
	sort(arr.begin(), arr.end());
	for (int i = 0; i < arr.size(); i++) {
		for (int j = 0; j < 5; j++) v[j] = arr[i][j];
		if (chk(v[1], v[2], v[3], v[4])) {
			visitCheck(v[1], v[2], v[3], v[4]);
			res.push_back({ -v[0], v[1], v[2], v[1] + v[3] - 1, v[2] + v[4] - 1 });
			if (--m == 0) break;
		}
	}
	if (m == 0) {
		for (int i = 0; i < res.size(); i++) {
			for (int j = 0; j < 5; j++) printf("%d ", res[i][j]);
			printf("\n");
		}
	}
	else {
		printf("0");
	}
}
반응형

'Algorithm' 카테고리의 다른 글

백준 5624 : 좋은 수  (0) 2021.11.17
백준 1091 : 카드 섞기  (0) 2021.11.17
백준 17089 : 세 친구  (0) 2021.11.17
백준 2411 : 아이템 먹기  (0) 2021.11.17
백준 17244 : 아맞다우산  (0) 2021.11.17

+ Recent posts