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

+ Recent posts