프로그래머스 - 기둥과 보 설치

J-Keonho·2020년 9월 15일
0
post-custom-banner

해당 알고리즘 자료는 제가 직접 푼 것도 있지만 다른 분들의 풀이과의 비교를 통해 더 나은 알고리즘을 공부하기 위해 정리한 것들입니다.

프로그래머스 - 기둥과 보 설치

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;
	}
}
profile
안녕하세요.
post-custom-banner

0개의 댓글