문제 : https://programmers.co.kr/learn/courses/30/lessons/60061

2020 카카오 BLINE RECRUITMENT 기둥과 보 설치


구현 시뮬레이션

 문제에 맞춰서 구현을 하는 문제입니다. 음... 저는 규칙을 잘못이해해서 문제를 푸는데 애를 먹었습니다.

[규칙]

 기둥은 바닥 위에 있거나 보의 한쪽 끝 부분 위에 있거나, 또는 다른 기둥 위에 있어야 합니다.

보는 한쪽 끝 부분이 기둥 위에 있거나, 또는 양쪽 끝 부분이 다른 보와 동시에 연결되어 있어야 합니다.

기둥과 보의 설치 가능한 조건을 다음과 같습니다. 저는 '보의 한쪽 끝 부분 위에 있거나' , '한쪽 끝 부분이 기둥 위에 있거나' 라는 규칙을 하나의 보 혹은 하나의 기둥의 한쪽 끝 부분 위에 있어야된다! 로 해석해서 다음과 같은 경우가 안된다고 생각했고, WA의 지옥에 빠졌습니다,,,,,,

#include <string>
#include <vector>
#include<algorithm>

using namespace std;

bool row[102][102], col[102][102];

bool isBuildRow(int x, int y) {
	return col[x][y - 1] || col[x + 1][y - 1] || (row[x - 1][y] && row[x + 1][y]);
}

bool isBuildCol(int x, int y) {
	return y == 1 || col[x][y - 1] || row[x - 1][y] || row[x][y];
}

bool isRemove(int n) {
	for (int i = 1; i <= n; i++)
		for (int j = 1; j <= n; j++) {
			if (row[i][j] && !isBuildRow(i, j))
				return false;
			if (col[i][j] && !isBuildCol( i, j))
				return false;
		}
	return true;
}

vector<vector<int>> solution(int n, vector<vector<int>> build_frame) {
	for (int i = 1; i <= 101; i++)
		for (int j = 1; j <= 101; j++)
			row[i][j] = col[i][j] = 0;

	for (int i = 0; i < build_frame.size(); i++) {
		int x = build_frame[i][0], y = build_frame[i][1], a = build_frame[i][2], b = build_frame[i][3];
		x++, y++;
		if (b == 0) { // 삭제
			if (a == 0) { // 기둥
				col[x][y] = 0;
				if (isRemove(n + 1))
					continue;
				col[x][y] = 1;
			}
			else {
				row[x][y] = 0;
				if (isRemove(n + 1))
					continue;
				row[x][y] = 1;
			}
		}
		else { // 설치
			if (a == 0) { // 기둥
				if (isBuildCol( x, y))
					col[x][y] = 1;
			}
			else { // 보
				if (isBuildRow( x, y))
					row[x][y] = 1;
			}
		}
	}

	vector<vector<int>> answer;
	for (int i = 1; i <= n + 1; i++)
		for (int j = 1; j <= n + 1; j++) {
			if (row[i][j])
				answer.push_back({ i - 1, j - 1, 1 });
			if (col[i][j])
				answer.push_back({ i - 1, j - 1, 0 });
		}
	sort(answer.begin(), answer.end());
	return answer;
}

 

+ Recent posts