20061 모노미노도미노2 > 2024KB, 4ms
- 속도 무난, 메모리 무난
- 단순 구현 문제
- 간단한 풀이
- 입력 받기
- blue 칸으로, green 칸으로 이동
- 4칸이 다 찬 게 있나 확인
- 특별한 칸에 블록이 있나 확인
- 단순한 구현 문제였다. 주의사항만 잘 숙지하면 무난하게 풀 수 있는 문제
- 주의 사항 : 중력이 작용하는게 아니라 "사라진 행/열 만큼만" 행/열이 움직이는 것!
#include <iostream>
using namespace std;
int map[10][10] = {};
int N, t, y, x, score = 0;
void move_blue() {
int new_x;
switch (t) {
case 1:
new_x = x + 1;
while (new_x <= 9 && map[y][new_x] == 0) new_x++;
map[y][new_x - 1] = 1;
break;
case 3:
new_x = x + 1;
while (new_x <= 9 && map[y][new_x] == 0 && map[y + 1][new_x] == 0) new_x++;
map[y][new_x - 1] = 1;
map[y + 1][new_x - 1] = 1;
break;
case 2:
new_x = x + 2;
while (new_x <= 9 && map[y][new_x] == 0) new_x++;
map[y][new_x - 1] = 1;
map[y][new_x - 2] = 1;
break;
}
}
void move_green() {
int new_y;
switch (t) {
case 1:
new_y = y + 1;
while (new_y <= 9 && map[new_y][x] == 0) new_y++;
map[new_y - 1][x] = 1;
break;
case 3:
new_y = y + 2;
while (new_y <= 9 && map[new_y][x] == 0) new_y++;
map[new_y - 1][x] = 1;
map[new_y - 2][x] = 1;
break;
case 2:
new_y = y + 1;
while (new_y <= 9 && map[new_y][x] == 0 && map[new_y][x + 1] == 0) new_y++;
map[new_y - 1][x] = 1;
map[new_y - 1][x + 1] = 1;
break;
}
}
void check_max() {
int move_col = 0;
for (int j = 9; j > 3; j--) {
int move_j = j;
if (move_col > 0) {
move_j = j + move_col;
for (int i = 0; i < 4; i++) {
map[i][move_j] = map[i][j];
map[i][j] = 0;
}
}
int cnt = 0;
for (int i = 0; i < 4; i++)
if (map[i][move_j] == 1) cnt++;
if (cnt == 4) {
for (int i = 0; i < 4; i++)
map[i][move_j] = 0;
move_col++;
score++;
}
}
int move_row = 0;
for (int i = 9; i > 3; i--) {
int move_i = i;
if (move_row > 0) {
move_i = i + move_row;
for (int j = 0; j < 4; j++) {
map[move_i][j] = map[i][j];
map[i][j] = 0;
}
}
int cnt = 0;
for (int j = 0; j < 4; j++)
if (map[move_i][j] == 1) cnt++;
if (cnt == 4) {
for (int j = 0; j < 4; j++)
map[move_i][j] = 0;
move_row++;
score++;
}
}
}
void check_pale() {
int move_col = 0;
for (int j = 4; j < 6; j++) {
for (int i = 0; i < 4; i++) {
if (map[i][j] == 1) {
move_col++;
break;
}
}
}
if (move_col > 0) {
for (int j = 9; j > 3 + move_col; j--) {
for (int i = 0; i < 4; i++) {
map[i][j] = map[i][j - move_col];
map[i][j - move_col] = 0;
}
}
}
int move_row = 0;
for (int i = 4; i < 6; i++) {
for (int j = 0; j < 4; j++) {
if (map[i][j] == 1) {
move_row++;
break;
}
}
}
if (move_row > 0) {
for (int i = 9; i > 3 + move_row; i--) {
for (int j = 0; j < 4; j++) {
map[i][j] = map[i - move_row][j];
map[i - move_row][j] = 0;
}
}
}
}
void solve() {
for (int n = 0; n < N; n++) {
cin >> t >> y >> x;
move_blue();
move_green();
check_max();
check_pale();
}
}
void result() {
cout << score << endl;
int blue = 0, green = 0;
for (int j = 6; j < 10; j++) {
for (int i = 0; i < 4; i++) {
if (map[i][j] == 1) blue++;
}
}
for (int i = 6; i < 10; i++) {
for (int j = 0; j < 4; j++) {
if (map[i][j] == 1) green++;
}
}
cout << blue + green;
}
int main() {
ios::sync_with_stdio(false);
cin.tie(NULL);
cout.tie(NULL);
cin >> N;
solve();
result();
}
'coding > baekjoon_codingstudy' 카테고리의 다른 글
20057 마법사 상어와 토네이도 (0) | 2022.10.10 |
---|---|
17825 주사위 윷놀이 (0) | 2022.10.10 |
12100 2048(Easy) (0) | 2022.10.03 |
21609 상어중학교 (0) | 2022.10.02 |
19238 스타트택시 (0) | 2022.10.02 |