알고리즘/프로그래머스
프로그래머스 - 기둥과 보 설치
시나모온
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
지적, 조언, 질문 환영입니다! 댓글 남겨주세요~