2 분 소요

프렌즈4블록 (프로그래머스 Level 2)

https://school.programmers.co.kr/learn/courses/30/lessons/17679

‘테트리스’ 처럼, 특정 조건을 만족하는 경우
블럭을 제거하고, 위쪽의 블럭을 ‘끌어오는’ 방식의 구현을 요구한다

따라서 함수를 2개로 나누어

  1. 4개씩 뭉쳐있는지 확인하고, 해당 부분을 세어준 뒤, 제거할 문자로 바꾼다
    (해당 개수가 0이라면 종료한다)
  2. 제거된 문자를 확인하고, 위쪽의 블록과 교체해준다
    를 각각 구현하였다

각 함수 구현 시, 유의한 점은

  1. 제거할 부분을 체크하되 한번 반복문 종료 후, 다시 반복문을 돌며 제거하고 세어준다
    (7개, 6개 등의 뭉쳐있는 경우에 대하여 올바르게 카운팅하기 위함)
  2. 아래 쪽의 제거 문자를 가장 먼저 만난 ‘제거 문자가 아닌 문자’와 교체
    (처음에 구현할 때는, ‘제거 문자가 아닌 문자’ 를 ‘제거 문자’로 교체하는 식으로 구현하여
    ‘블럭’이 ‘내려오는 듯’한 구현을 하지 못하였다)
    (괄호 방식대로 구현 시, 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;
}

댓글남기기