2019 KAKAO BLIND RECRUITMENT (2019 카카오 블라인드 채용 문제)
블록 게임을 통해 총 몇개의 블록이 제거되는지 찾는 문제입니다.
문제
1. 2*2 블럭의 모양이 모두 같으면 해당 2*2 블럭은 제거됩니다.
2. 1.번을 통해 블럭들이 제거되면 블럭들 아래에 블럭이 없는 경우 블럭을 내립니다.
3. 1, 2번을 더 이상 할 수 없을때 까지 반복한 후 제거된 블럭 개수를 출력합니다.
해결 방법
1. temp = board (temp는 제거될 블럭들을 임시적으로 표시하는 용도)
2. 반복문을 통해 2*2 모양이 같은 블럭 탐색
2-1. 같은 경우 temp에 해당 블럭들 체크 (' ' 공백으로 처리)
2-2. check 변수를 true 변경 (블럭 제거 과정이 있었다는 것을 의미)
3. 반복문을 통해 temp에 블럭 밑에 ' ' 공백이 있는 경우 블럭을 아래로 내림
4. board = temp
5. check가 false일 때 (블럭 제거 과정이 없을 경우)까지 1~5 반복
6. board에 ' ' 공백의 개수를 카운트해서 출력
#include <iostream>
#include <string>
#include <vector>
using namespace std;
int solution(int m, int n, vector<string> board)
{
int answer = 0;
bool check = true;
vector<string> temp;
while (check)
{
check = false;
temp = board;
for (int i = 0; i < m - 1; ++i)
{
for (int j = 0; j < n - 1; ++j)
{
char c = board[i][j];
if (board[i][j] != ' ' && board[i][j + 1] == c && board[i + 1][j] == c && board[i + 1][j + 1] == c)
{
check = true;
temp[i][j] = ' ';
temp[i][j + 1] = ' ';
temp[i + 1][j] = ' ';
temp[i + 1][j + 1] = ' ';
}
}
}
for (int i = 1; i < m; ++i)
{
for (int j = 0; j < n; ++j)
{
int k = 1;
if (temp[i][j] != ' ')
{
continue;
}
while (i - k >= 0)
{
if (temp[i - k][j] != ' ')
{
temp[i - k + 1][j] = temp[i - k][j];
temp[i - k][j] = ' ';
++k;
}
else
{
temp[i - k + 1][j] = ' ';
break;
}
}
}
}
board = temp;
}
for (int i = 0; i < m; ++i)
{
for (int j = 0; j < n; ++j)
{
if (board[i][j] == ' ')
{
++answer;
}
}
}
return answer;
}
'알고리즘' 카테고리의 다른 글
[C++] 프로그래머스 - N진수 게임 (0) | 2021.05.18 |
---|---|
[C++] 프로그래머스 - 캐시 (0) | 2021.05.14 |
[C++] 프로그래머스 - 뉴스 클러스터링 (0) | 2021.05.14 |
[C++] 프로그래머스 - 오픈채팅방 (0) | 2021.05.07 |
[C++] 프로그래머스 - 다트 게임 (0) | 2021.05.04 |