[ 프로그래머스 ] [1차] 프렌즈4블록
문제
https://school.programmers.co.kr/learn/courses/30/lessons/17679
풀이
match-3 게임과 같은 방식으로 일정 이상의 같은 블록이 일정 배치를 가질 때, 이를 파괴하고 빈 칸을 파괴된 블록 위에 위치한 블록으로 채우는 방식이다. 따라서 파괴 가능 배치 조건 2×2를 이루는 같은 블록 배치를 찾아 제거하고, 해당 블록 위에 위치한 블록을 이동 시키는 코드를 구현하여 파괴 가능 배치 조건을 이루는 블록들이 존재하지 않을 때까지 파괴한 블록의 개수를 구하였다.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
#include <string>
#include <vector>
using namespace std;
bool is2X2[30][30] = { false };
int solution(int m, int n, vector<string> board)
{
int answer = 0;
int sameBlock = 0;
bool isWork = true;
while (isWork == true)
{
isWork = false;
for (int i = 0; i < board.size() - 1; i++)
{
for (int j = 0; j < board[i].size() - 1; j++)
{
sameBlock = board[i][j];
if (sameBlock == board[i + 1][j] && sameBlock == board[i][j + 1] && sameBlock == board[i + 1][j + 1] && board[i][j] != '1' && board[i][j] != '0')
{
is2X2[i][j] = true;
is2X2[i + 1][j] = true;
is2X2[i][j + 1] = true;
is2X2[i + 1][j + 1] = true;
isWork = true;
}
}
}
for (int i = 0; i < board.size(); i++)
{
for (int j = 0; j < board[i].size(); j++)
{
if (is2X2[i][j] == true)
{
is2X2[i][j] = false;
board[i][j] = '1';
answer++;
}
}
}
for (int j = 0; j < n; j++)
{
for (int i = m - 2; i >= 0; i--)
{
if (board[i][j] == '1') continue;
for (int k = m - 1; k > i; k--)
{
if (board[k][j] == '1')
{
board[k][j] = board[i][j];
board[i][j] = '1';
break;
}
}
}
}
}
return answer;
}
이 기사는 저작권자의 CC BY 4.0 라이센스를 따릅니다.