코딩테스트/카카오

카카오 1차 코딩테스트 6번 프렌즈4블록 문제풀이

글로벌디노 2018. 6. 6. 13:57

카카오 1차 코딩 테스트 6번 문제풀이

문제 및 해설 바로가기

6. 프렌즈4블록(난이도: 상)


입출력 예제

m

n

board

answer

4

5

CCBDE

AAADE

AAABF

CCBBF

14

6

6

TTTANT

RRFACC

RRRFCC

TRRRAA

TTMMMF

TMMTTJ

15


C++ 소스코드

#include <iostream>
#include <string>
using namespace std;

int main()
{
	// m: 높이, n: 넓이 2이상 30이하
	int m, n;
	cin >> m >> n;
	
	string board[30];
	for (int i = 0; i < m; i++)
		cin >> board[i];

	int nBoard[30][30];
	for (int i = 0; i < m; i++)
		for (int j = 0; j < n; j++)
			nBoard[i][j] = 1;

	int answer = 0;
	while (true)
	{
		bool isFind = false;

		// 모든 블럭 돌면서 2 x 2 같은블럭 찾으면 nBoard에 2 표시하기
		for (int i = 0; i < m - 1; i++)
		{
			for (int j = 0; j < n - 1; j++)
			{
				char block = board[i][j];
				if (block != ' ' && block == board[i][j + 1] 
					&& block == board[i + 1][j] && block == board[i + 1][j + 1])
				{
					nBoard[i][j] = 2;
					nBoard[i][j + 1] = 2;
					nBoard[i + 1][j] = 2;
					nBoard[i + 1][j + 1] = 2;
					isFind = true;
				}
			}
		}

		if (!isFind) break;

		// nBoard가 2인 board의 동일한 위치값을 지운다(' '로 채운다)
		// 결과 값(지워진 개수) 추가
		for (int i = 0; i < m; i++)
		{
			for (int j = 0; j < n; j++)
			{
				if (nBoard[i][j] == 2)
				{
					nBoard[i][j] = 0;
					board[i][j] = ' ';
					answer++;
				}
			}
		}

		// 블럭 내리기
		for (int i = m - 2; i >= 0; i--)
		{
			for (int j = 0; j < n; j++)
			{
				if (nBoard[i][j] == 1)
				{
					int k = i;
					while (k < m - 1)
					{
						if (nBoard[k + 1][j] == 1) break;
						k++;
					}
					
					if (k != i)
					{
						nBoard[k][j] = 1;
						nBoard[i][j] = 0;
						board[k][j] = board[i][j];
						board[i][j] = ' ';
					}
				}
			}
		}

		// 현재 board 출력
		cout << endl;
		for (int i = 0; i < m; i++)
			cout << board[i] << endl;
	}

	// 결과 출력
	cout << "Answer: " << answer << endl;

	system("pause");
	return 0;
}