굥뷰를 햡시댜

[2018 Kakao Blind] 블록게임 본문

알고리즘 문제 풀이/2019 Kakao Blind 문제 풀이

[2018 Kakao Blind] 블록게임

GodZ 2019. 9. 5. 17:15

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

 

코딩테스트 연습 - 블록 게임 | 프로그래머스

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

programmers.co.kr

 

출제자의 의도가 무엇인지는 모르겠지만 야매로 풀 수 있는 문제.

 

내가 푼 방법은 통과는 했지만 정해는 아니라고 생각한다.

 

문제에서 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;
}

 

 

Comments