알고리즘/프로그래머스

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

시나모온 2020. 9. 8. 09:49

문제 링크입니다 : 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

 

구현 문제이다. 카카오는 구현을 확실히 좋아하는 거 같다.

 

고려해야 하는 조건들 꽤 많다.

실제 시험에서 이 문제를 만났다면 시간 내에 절대 못 풀었을 것 같다...ㅠㅠ

 

1시간 약간 넘게 걸려서 푼 것 같다. 심지어 편안한 마음에 풀었으니 실제로 이 문제를 만났다면...

 

 

 

#include <string>
#include <vector>
#include <iostream>

using namespace std;

int N;
vector<vector<bool>> col_installed;
vector<vector<bool>> floor_installed;

bool isFloorSafe(int y, int x) {
    if(!floor_installed[y][x]) return true;
    
    if(y != 0) {
        if(col_installed[y - 1][x]) return true;
        if(x != N && col_installed[y - 1][x + 1]) return true;   
    }
    if(x != 0 && x != N && floor_installed[y][x - 1] && floor_installed[y][x + 1]) return true;
    
    return false;
}

bool isColSafe(int y, int x) {
    if(!col_installed[y][x]) return true;
    
    if(y != 0 && col_installed[y - 1][x]) return true;
    if(floor_installed[y][x]) return true;
    if(x != 0 && floor_installed[y][x - 1]) return true;
    
    return false;
}

void installFloor(int y, int x) {
    if(y == 0) floor_installed[y][x] = true;
    else {
        if(col_installed[y - 1][x]) {
            floor_installed[y][x] = true;
        } else if(x != N && col_installed[y - 1][x + 1]) {
            floor_installed[y][x] = true;
        } else if(x != 0 && x != N && floor_installed[y][x - 1] && floor_installed[y][x + 1]) {
            floor_installed[y][x] = true;
        }
    }
}


void installCol(int y, int x) {
    if(y == 0) col_installed[y][x] = true;
    else {
        if(col_installed[y - 1][x]) col_installed[y][x] = true;
        if(floor_installed[y][x]) {
            col_installed[y][x] = true;
        } else if(x != 0 && floor_installed[y][x - 1]) {
            col_installed[y][x] = true;
        }
    }
}

void deleteFloor(int y, int x) {
    floor_installed[y][x] = false;
    if(!isColSafe(y, x)) {floor_installed[y][x] = true; return; }
    if(x != N && !isColSafe(y, x + 1)) {floor_installed[y][x] = true; return; }
    if(x != 0 && !isFloorSafe(y, x - 1)) {floor_installed[y][x] = true; return; }
    if(x != N && !isFloorSafe(y, x + 1)) {floor_installed[y][x] = true; return; }
}


void deleteCol(int y, int x) {
    col_installed[y][x] = false;
    if(y != N - 1) {
        if(!isColSafe(y + 1, x)) {col_installed[y][x] = true; return; }
        if(x != 0 && !isFloorSafe(y + 1, x - 1)) {col_installed[y][x] = true; return; }
        if(!isFloorSafe(y + 1, x)) {col_installed[y][x] = true; return; }
    }
}




vector<vector<int>> solution(int n, vector<vector<int>> build_frame) {
    vector<vector<int>> answer;
    N = n;
    col_installed.assign(N + 1, vector<bool>(N + 1, false));
    floor_installed.assign(N + 1, vector<bool>(N + 1, false));
    
    for(int i = 0; i < build_frame.size(); i++) {
        int y = build_frame[i][1];
        int x = build_frame[i][0];
        bool isFloor = build_frame[i][2];
        bool isInstalling = build_frame[i][3];
        
        if(isFloor) {
            if(isInstalling) {
                installFloor(y, x);
            } else {
                deleteFloor(y, x);
            }
        } else {
            if(isInstalling) {
                installCol(y, x);
            } else {
                deleteCol(y, x);
            }
        }
    }
    
    for(int j = 0; j <= N; j++) {
        for(int i = 0; i <= N; i++) {
            if(col_installed[i][j]) {
                answer.push_back({j, i, 0});
            }
            if(floor_installed[i][j]) {
                answer.push_back({j, i, 1});
            }
        }
    }
    
    
    for(int i = 0; i < answer.size(); i++) {
        for(int j = 0; j <answer[i].size(); j++) {
            cout << answer[i][j] << ' ';
        }
        cout << endl;
    }
    
    
    
    return answer;
}

 

 

 

개발 환경 : vscode

지적, 조언, 질문 환영입니다! 댓글 남겨주세요~