- 기둥과 보를 설치,해체하는 조건들이 담긴 벡터가 주어졌을 때, 이를 순서대로 실행해서 설치되거나, 해체하거나, 혹은 설치해체가 이루어지지 않는 조건이던가 해서 모두 진행한 뒤 나온 결과값을 리턴하는 로직을 짜는 문제이다.
- 건설되는 기둥과 보의 좌표값이 격자를 따라 간다고 되어 있으므로 이것을 조금 수정해서 격자의 가로세로변을 원소로 담는 새로운 배열을 기둥, 보 각각 새로 선언해서 읽어야한다.
- 그런 뒤에 기둥을 건설할 수 있는지, 보를 건설할 수 있는지, 기둥과 보를 해체할 수 있는지에 대한 체크함수를 만들어줄 수 있다.
문제에서 나온 조건대로 그려줄 수 있다.
#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
'Algorithm > programmers' 카테고리의 다른 글
프로그래머스 고득점 Kit 하루만에 뽀개기 - 2. 스택,큐 (Java, C++) (0) | 2022.03.18 |
---|---|
프로그래머스 고득점 Kit 하루 만에 뽀개기 - 1. 해시(Java, C++) (0) | 2022.03.18 |
2020 Kakao blind 60060 - 가사검색(이분탐색, 트라이 자료구조) c++ (0) | 2021.09.09 |
2020 Kakao blind 60059 - 자물쇠와 열쇠(완전탐색, 배열) c++ (0) | 2021.09.09 |
2020 Kakao blind 60058 - 괄호 변환(스택, 재귀 구현) c++ (0) | 2021.09.09 |