프로그래머스 Level 2 프렌즈4블록
프렌즈4블록 (프로그래머스 Level 2)
https://school.programmers.co.kr/learn/courses/30/lessons/17679
‘테트리스’ 처럼, 특정 조건을 만족하는 경우
블럭을 제거하고, 위쪽의 블럭을 ‘끌어오는’ 방식의 구현을 요구한다
따라서 함수를 2개로 나누어
- 4개씩 뭉쳐있는지 확인하고, 해당 부분을 세어준 뒤, 제거할 문자로 바꾼다
(해당 개수가 0이라면 종료한다) - 제거된 문자를 확인하고, 위쪽의 블록과 교체해준다
를 각각 구현하였다
각 함수 구현 시, 유의한 점은
- 제거할 부분을 체크하되 한번 반복문 종료 후, 다시 반복문을 돌며 제거하고 세어준다
(7개, 6개 등의 뭉쳐있는 경우에 대하여 올바르게 카운팅하기 위함) - 아래 쪽의 제거 문자를 가장 먼저 만난 ‘제거 문자가 아닌 문자’와 교체
(처음에 구현할 때는, ‘제거 문자가 아닌 문자’ 를 ‘제거 문자’로 교체하는 식으로 구현하여
‘블럭’이 ‘내려오는 듯’한 구현을 하지 못하였다)
(괄호 방식대로 구현 시, xxABCD -> CDABxx 가 되어버렸다)
(올바른 구현은 xxABCD -> ABCDxx)
단순 구현 문제이지만, 생각보다 시간이 오래걸렸다
또한 디버깅을 하기 힘든 환경이라면 사소한 구현에 더 시간을 빼앗길 것 같은 문제였다
Code
#include <string>
#include <vector>
using namespace std;
int check(vector<string>& board)
{
int result = 0;
int bSize1 = board.size();
int bSize2 = board[0].size();
// 이게 true로 되어 있는 녀석들 나중에 싹 'x'(소문자)로 바꿔주기
vector<vector<bool>> checker(bSize1,vector<bool>(bSize2,false));
for (int y = 0; y < bSize1 - 1; y++)
{
for (int x = 0; x < bSize2 - 1; x++)
{
// 2x2
char now = board[y][x];
if (now == 'x')
continue;
if (now == board[y][x + 1] &&
now == board[y + 1][x] &&
now == board[y + 1][x + 1])
{
checker[y][x] = true;
checker[y][x + 1] = true;
checker[y + 1][x] = true;
checker[y + 1][x + 1] = true;
}
}
}
for (int i = 0; i < bSize1; i++)
{
for (int j = 0; j < bSize2; j++)
{
if (checker[i][j])
{
board[i][j] = 'x';
result++;
}
}
}
int c = 0;
return result;
}
void sortingFunc(vector<string>& board)
{
int bSize1 = board.size();
int bSize2 = board[0].size();
for (int y = bSize1 - 1; y >= 1; y--)
{
for (int x = 0; x < bSize2; x++)
{
if (board[y][x] == 'x')
{
int idx = 0;
bool isFind = false;
for (int i = y - 1; i >= 0; i--)
{
if (board[i][x] != 'x')
{
idx = i;
isFind = true;
break;
}
}
if (isFind)
swap(board[y][x], board[idx][x]);
}
}
}
}
int solution(int m, int n, vector<string> board) {
int answer = 0;
while (true)
{
auto temp = board;
int result = check(board);
if (result == 0)
{
break;
}
else
{
answer += result;
sortingFunc(board);
}
}
return answer;
}
댓글남기기