해당 알고리즘 자료는 제가 직접 푼 것도 있지만 다른 분들의 풀이과의 비교를 통해 더 나은 알고리즘을 공부하기 위해 정리한 것들입니다.
https://programmers.co.kr/learn/courses/30/lessons/60061
풀이 : 기둥과 보를 추가 및 제거 하였을때 연결되어 있을 기둥과 보의 조건을 점검
// 코드의 가시성은 좋지 않지만, 세부조건을 설정한 덕분에 시간 효율성은 빠른 것 같다.
class Solution {
public int[][] solution(int n, int[][] build_frame) {
boolean [][] p = new boolean [n+3][n+3];
boolean [][] c = new boolean [n+3][n+3];
int cnt = 0 ;
for (int [] i : build_frame) {
int x = i[0] + 1;
int y = i[1] + 1;
switch (i[2]) {
case 0: // 기둥
if(i[3] == 1) {
if(y == 1 || c[y-1][x] || p[y][x] || p[y][x-1]) {
c[y][x] = true;
cnt++;
}
}else {
if(c[y][x]) {
c[y][x] = false;
cnt--;
if(!checkC(x, y+1, c, p) || !checkP(x, y+1, c, p) || !checkP(x-1, y+1, c, p)) {
c[y][x] = true;
cnt++;
}
}
}
break;
case 1: // 보
if(i[3] == 1) {
if(c[y-1][x] || c[y-1][x+1] || (p[y][x-1] && p[y][x+1])) {
p[y][x] = true;
cnt++;
}
}else {
if(p[y][x]) {
p[y][x] = false;
cnt--;
if(!checkC(x, y, c, p) || !checkC(x+1, y, c, p) || !checkP(x-1, y, c, p) || !checkP(x+1, y, c, p)) {
p[y][x] = true;
cnt++;
}
}
}
break;
}
}
int [][] result = new int [cnt][3];
int idx = 0;
for (int i = 1; i <= n+1; i++) {
for (int j = 1; j <= n+1; j++) {
if(c[j][i]) {
result[idx][0] = i-1;
result[idx][1] = j-1;
result[idx++][2] = 0;
}
if(p[j][i]) {
result[idx][0] = i-1;
result[idx][1] = j-1;
result[idx++][2] = 1;
}
}
}
return result;
}
private static boolean checkP(int x, int y, boolean[][] c, boolean[][] p) {
if(!p[y][x]) return true;
if(c[y-1][x] || c[y-1][x+1]) return true;
if(p[y][x-1] && p[y][x+1]) return true;
return false;
}
private static boolean checkC(int x, int y, boolean[][] c, boolean[][] p) {
if(!c[y][x]) return true;
if(y == 1 || c[y-1][x]) return true;
if(p[y][x] || p[y][x-1]) return true;
return false;
}
}