본문 바로가기
Algorithm/programmers

2020 Kakao blind 60061 - 기둥과 보 설치(배열) c++

by Ellery 2021. 9. 9.

- 기둥과 보를 설치,해체하는 조건들이 담긴 벡터가 주어졌을 때, 이를 순서대로 실행해서 설치되거나, 해체하거나, 혹은 설치해체가 이루어지지 않는 조건이던가 해서 모두 진행한 뒤 나온 결과값을 리턴하는 로직을 짜는 문제이다. 

- 건설되는 기둥과 보의 좌표값이 격자를 따라 간다고 되어 있으므로 이것을 조금 수정해서 격자의 가로세로변을 원소로 담는 새로운 배열을 기둥, 보 각각 새로 선언해서 읽어야한다. 

- 그런 뒤에 기둥을 건설할 수 있는지, 보를 건설할 수 있는지, 기둥과 보를 해체할 수 있는지에 대한 체크함수를 만들어줄 수 있다. 
문제에서 나온 조건대로 그려줄 수 있다. 

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

using namespace std;

bool col[101][101] = {0}; // 기둥
bool row[101][101] = {0}; // 보

bool checkCol(int x, int y) { // 가로세로
    if(y == 0) return true; // 바닥
    if(col[x][y-1]) return true; // 밑에 기둥 있음
    if(x > 0 && row[x-1][y]) return true; // 바닥이 아니고 보가 왼쪽에서 오른쪽으로 오면
    if(row[x][y]) return true; // 밑에 보가 있으면
    
    return false;
}

bool checkRow(int x, int y) {
    if (col[x][y-1] || col[x+1][y-1]) return true; // 왼쪽이나 오른쪽 밑에 기둥 있음
    if (x > 0 && row[x-1][y] && row[x+1][y]) return true; // 왼쪽 오른쪽에 보가 있어서 그 사이에 연결
    
    return false;
}

bool canRemove(int x, int y) {
    for(int i = max(0, x - 1); i <= x + 1; ++i) {
        for(int j = y; j <= y + 1; ++j) {
            if(col[i][j] && !checkCol(i, j)) return false;
            if(row[i][j] && !checkRow(i,j)) return false;
        }
    }
    
    return true;
}

// build_frame [x,y,a,b] 가로,세로,기둥보01, 삭제설치01
// answer [x,y,a] xy기둥보교차좌표, 기둥보01, x,y가 같으면 기둥-보 순
vector<vector<int>> solution(int n, vector<vector<int>> build_frame) {
    for(vector<int>& frame: build_frame) {
        int x, y, type, action;
        x = frame[0], y = frame[1], type = frame[2], action = frame[3];
        
        if(type == 0) {
            if(action == 1) {
                if(checkCol(x, y)) col[x][y] = true;
            } else {
                col[x][y] = false;
                if(!canRemove(x,y)) col[x][y] = true;
            }
        } else {
            if(action == 1) {
                if(checkRow(x,y)) row[x][y] = true;
            } else {
                row[x][y] = false;
                if(!canRemove(x, y)) row[x][y] = true;
            }
        }
    }
    
    vector<vector<int>> ans;
    for(int i = 0; i <= n; ++i) {
        for(int j = 0; j<= n; ++j) {
            if(col[i][j]) ans.push_back({i, j, 0});
            if(row[i][j]) ans.push_back({i, j, 1});
        }
    }
    
    return ans;
}

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

 

코딩테스트 연습 - 기둥과 보 설치

5 [[1,0,0,1],[1,1,1,1],[2,1,0,1],[2,2,1,1],[5,0,0,1],[5,1,0,1],[4,2,1,1],[3,2,1,1]] [[1,0,0],[1,1,1],[2,1,0],[2,2,1],[3,2,1],[4,2,1],[5,0,0],[5,1,0]] 5 [[0,0,0,1],[2,0,0,1],[4,0,0,1],[0,1,1,1],[1,1,1,1],[2,1,1,1],[3,1,1,1],[2,0,0,0],[1,1,1,0],[2,2,0,1]] [[

programmers.co.kr