프로그래머스(Programmers)
프로그래머스 프렌즈4블록 C++
cosmohoo
2022. 7. 14. 23:43
반응형
위 초기 배치를 문자로 표시하면 아래와 같다.
TTTANT
RRFACC
RRRFCC
TRRRAA
TTMMMF
TMMTTJ
각 문자는 라이언(R), 무지(M), 어피치(A), 프로도(F), 네오(N), 튜브(T), 제이지(J), 콘(C)을 의미한다
입력으로 블록의 첫 배치가 주어졌을 때, 지워지는 블록은 모두 몇 개인지 판단하는 프로그램을 제작하라.
입력 형식
- 입력으로 판의 높이 m, 폭 n과 판의 배치 정보 board가 들어온다.
- 2 ≦ n, m ≦ 30
- board는 길이 n인 문자열 m개의 배열로 주어진다. 블록을 나타내는 문자는 대문자 A에서 Z가 사용된다.
출력 형식
입력으로 주어진 판 정보를 가지고 몇 개의 블록이 지워질지 출력하라.
입출력 예제
mnboardanswer
4 | 5 | ["CCBDE", "AAADE", "AAABF", "CCBBF"] | 14 |
6 | 6 | ["TTTANT", "RRFACC", "RRRFCC", "TRRRAA", "TTMMMF", "TMMTTJ"] | 15 |
=> DFS나 BFS를 사용하는 문제가 아닌 단순구현문제였습니다.
=> 문제풀이에 관한 설명은 아래의 그림으로 대체하겠습니다.
#include <string>
#include <vector>
using namespace std;
bool TrueBoard[31][31] = {false,};
void init()
{
for(int i=0; i<32; i++)
{
for(int j=0; j<32; j++)
{
TrueBoard[i][j] =false;
}
}
}
int solution(int m, int n, vector<string> board) {
int answer = 0;
//부신 블록수
int breakCnt =0;
//2x2 블록 확인할 행렬
int dx[3] = {0,1,1};
int dy[3] = {1,1,0};
do
{
//TrueBoard 초기화
init();
//while문을 위한 answer 설정
answer = breakCnt;
//지울블록 확인
for(int i=0; i<m-1; i++)
{
for(int j=0; j<n-1; j++)
{
if(board[i][j] == '-')continue;
char tmp = board[i][j];
if((tmp == board[i+dx[0]][j+dy[0]]) && (tmp == board[i+dx[1]][j+dy[1]]) && (tmp == board[i+dx[2]][j+dy[2]]))
{
TrueBoard[i][j] = true;
TrueBoard[i+dx[0]][j+dy[0]] = true;
TrueBoard[i+dx[1]][j+dy[1]] = true;
TrueBoard[i+dx[2]][j+dy[2]] = true;
}
}
}
//블록지우기
for(int i=0; i<m; i++)
{
for(int j=0; j<n; j++)
{
//지운다고 체크되어있다면 '-'표시
if(TrueBoard[i][j])
{
board[i][j] = '-';
breakCnt++;
}
}
}
//빈공간 채워넣기
for(int i=1; i<m; i++)
{
for(int j=0; j<n; j++)
{
//해당공간이 비어있다면
if(board[i][j] == '-')
{
int tmpx = i;
while(tmpx > 0)
{
board[tmpx][j] = board[tmpx-1][j];
board[tmpx-1][j] ='-';
tmpx --;
}
}
}
}
}while(answer != breakCnt);
//이번시도에 부서진 블록수(breakCnt)와 이전시도까지 부서진 블록수와 갯수가 똑같을 경우 => 더이상 부서지지 않을 경우
return answer;
}
반응형