굥뷰를 햡시댜
[2018 Kakao Blind] 블록게임 본문
https://programmers.co.kr/learn/courses/30/lessons/42894
출제자의 의도가 무엇인지는 모르겠지만 야매로 풀 수 있는 문제.
내가 푼 방법은 통과는 했지만 정해는 아니라고 생각한다.
문제에서 1x1짜리 검은 블록을 이미 board에 놓여진 블록 위에 쌓아 속이 꽉 찬 직사각형 형태를 만들었을 경우 그 블록을 지울 수 있다고 했다.
나 같은 경우는 친절하게 블록이 놓일 수 있는 경우의 수를 문제에서 제시해줘서 문제를 쉽게 풀 수 있었다.
일단 문제에서 검은 블록을 쌓았을 때 직사각형을 만들 수 있는 블록은 아래의 그림과 같이 5가지 경우밖에 없다.
나머지 경우의 블록 같은 경우에는 검은 블록을 쌓아도 속이 꽉 찬 직사각형을 만들 수 없기 때문에 고려하지 않아도 된다.
- 풀이 방법
1. 위에 제시한 5가지 경우의 블록에 대해 하드코딩했다.
(소스코드에 주석처리한 1번, 2번, 3번, 4번, 5번 도형은 위에 제시한 5가지 도형을 순서대로 나타낸 것이다.)
#include <string>
#include <vector>
using namespace std;
int solution(vector<vector<int>> board) {
int answer = 0;
int r = board.size();
int c = board[0].size();
bool flag = true;
while (flag) {
flag = false;
for (int x = 0; x < c; x++) {
for (int y = 0; y < r; y++) {
if (board[y][x] != 0) {
//1번 도형
if (y + 1 < r && x + 2 < c) {
if (board[y][x] == board[y + 1][x] && board[y][x] == board[y + 1][x + 1] && board[y][x] == board[y + 1][x + 2]) {
bool flag1 = true;
for (int u = 0; u < y + 1; u++) {
if (board[u][x + 1] != 0 || board[u][x + 2] != 0) {
flag1 = false;
break;
}
}
if (flag1) {
flag = true;
board[y][x] = 0, board[y + 1][x] = 0, board[y + 1][x + 1] = 0, board[y + 1][x + 2] = 0;
answer += 1;
continue;
}
}
}
//2번 도형
if (y - 2 >= 0 && x + 1 < c) {
if (board[y][x] == board[y][x + 1] && board[y][x] == board[y - 1][x + 1] && board[y][x] == board[y - 2][x + 1]) {
bool flag1 = true;
for (int u = 0; u < y; u++) {
if (board[u][x] != 0) {
flag1 = false;
break;
}
}
if (flag1) {
flag = true;
board[y][x] = 0, board[y][x + 1] = 0, board[y - 1][x + 1] = 0, board[y - 2][x + 1] = 0;
answer += 1;
continue;
}
}
}
//3번 도형
if (y + 2 < r && x + 1 < c) {
if (board[y][x] == board[y + 1][x] && board[y][x] == board[y + 2][x] && board[y][x] == board[y + 2][x + 1]) {
bool flag1 = true;
for (int u = 0; u < y + 2; u++) {
if (board[u][x + 1] != 0) {
flag1 = false;
break;
}
}
if (flag1) {
flag = true;
board[y][x] = 0, board[y + 1][x] = 0, board[y + 2][x] = 0, board[y + 2][x + 1] = 0;
answer += 1;
continue;
}
}
}
//4번 도형
if (y - 1 >= 0 && x + 2 < c) {
if (board[y][x] == board[y][x + 1] && board[y][x] == board[y][x + 2] && board[y][x] == board[y - 1][x + 2]) {
bool flag1 = true;
for (int u = 0; u < y; u++) {
if (board[u][x] != 0 || board[u][x + 1] != 0) {
flag1 = false;
break;
}
}
if (flag1) {
flag = true;
board[y][x] = 0, board[y][x + 1] = 0, board[y][x + 2] = 0, board[y - 1][x + 2] = 0;
answer += 1;
continue;
}
}
}
//5번 도형
if (y - 1 >= 0 && x + 2 < c) {
if (board[y][x] == board[y][x + 1] && board[y][x] == board[y][x + 2] && board[y][x] == board[y - 1][x + 1]) {
bool flag1 = true;
for (int u = 0; u < y; u++) {
if (board[u][x] != 0 || board[u][x + 2] != 0) {
flag1 = false;
break;
}
}
if (flag1) {
flag = true;
board[y][x] = 0, board[y][x + 1] = 0, board[y][x + 2] = 0, board[y - 1][x + 1] = 0;
answer += 1;
continue;
}
}
}
}
}
}
}
return answer;
}
'알고리즘 문제 풀이 > 2019 Kakao Blind 문제 풀이' 카테고리의 다른 글
[2018 Kakao Blind] 무지의 먹방 라이브 (0) | 2019.08.12 |
---|---|
[2018 Kakao Blind] 실패율 (0) | 2019.08.08 |
[2018 Kakao Blind] 오픈채팅방 (0) | 2019.08.07 |
Comments