[백준/바킹독] 0308 시뮬레이션 2

OOING·2024년 3월 8일
0

백준+알고리즘 공부

목록 보기
58/75

친구들과 하는 하루 3문제 인증 기록용으로 다시 작성 시작
왜 시뮬레이션 2냐면 어제도 시뮬레이션 문제 풀었기 때문. 벨로그에 올리진 않았다.

오늘의 문제
11559 Puyo Puyo
14891 톱니바퀴
14499 주사위 굴리기

11559 Puyo Puyo

코드

#include <bits/stdc++.h>
using namespace std;

int board[12][6] = { }, tmp[12][6] = { };
int dx[4] = { 1, -1, 0, 0 };
int dy[4] = { 0, 0, 1, -1 };

bool check(int x, int y) {
	return x >= 0 && x < 12 && y >= 0 && y < 6;
}

int puyo() {
	int cnt = 0;
	bool bomb = false;

	while(1) {
		for (int x = 0; x < 12; x++) {
			for (int y = 0; y < 6; y++)
				tmp[x][y] = board[x][y];
		}

		for (int j = 0; j < 6; j++) {
			int i = 0;

			while (i < 12) {
				if (board[i][j] == 0) {
					++i;
					continue;
				}
				int now = board[i][j];
				queue<pair<int, int>> q;
				q.push({ i, j });
				int same = 1;
				tmp[i][j] = 0;

				while (!q.empty()) {
					int nowx = q.front().first;
					int nowy = q.front().second;
					q.pop();

					for (int d = 0; d < 4; d++) {
						int nextx = nowx + dx[d];
						int nexty = nowy + dy[d];

						if (check(nextx, nexty) && tmp[nextx][nexty] == now) {
							q.push({ nextx, nexty });
							tmp[nextx][nexty] = 0;
							++same;
						}
					}
				}

				if (same >= 4) {
					bomb = 1;
					for (int x = 0; x < 12; x++) {
						for (int y = 0; y < 6; y++)
							board[x][y] = tmp[x][y];
					}
					
				}
				else {
					for (int x = 0; x < 12; x++) {
						for (int y = 0; y < 6; y++)
							tmp[x][y] = board[x][y];
					}
				}
				++i;
			}
		}
		if (bomb) {
			++cnt;
			bomb = 0;
			for (int c = 0; c < 6; c++) {
				queue<int> tq;
				for (int r = 0; r < 12; r++) {
					if (tmp[r][c] != 0) tq.push(tmp[r][c]);
				}
				int idx = 0, qs = tq.size();
				for (idx = 0; idx < qs; idx++) {
					board[idx][c] = tq.front();
					tq.pop();
				}
				for (; idx < 12; idx++) board[idx][c] = 0;
			}
		}
		else break;
	}
	
	return cnt;
}

int main() {
	for (int i = 11; i >= 0; i--) {
		for (int j = 0; j < 6; j++) {
			char c;
			cin >> c;
			if (c == 'R') board[i][j] = 1;
			else if (c == 'G') board[i][j] = 2;
			else if (c == 'B') board[i][j] = 3;
			else if (c == 'P') board[i][j] = 4;
			else if (c == 'Y') board[i][j] = 5;
		}
	}
	cout << puyo();
}

'연쇄'를 잘못 이해하고 풀어서 실질적으로 구현하는 시간보다 수정하고 오류 잡는데 더 많은 시간을 썼다😕

14891 톱니바퀴

코드

#include <bits/stdc++.h>
using namespace std;

string gear[4];

void rotate(int k, int dir) {
	string tmp = "";
	if (dir == 1) {
		tmp += gear[k][7];
		for (int i = 0; i < 7; i++) tmp += gear[k][i];
	}
	else {
		for (int i = 1; i < 8; i++) tmp += gear[k][i];
		tmp += gear[k][0];
	}
	gear[k] = tmp;
}

int main() {
	for (int i = 0; i < 4; i++) {
		cin >> gear[i];
	}

	int n;
	cin >> n;
	while (n--) {
		int num, dir;
		cin >> num >> dir;
		char gear_se[4][2];
		for (int i = 0; i < 4; i++) {
			gear_se[i][0] = gear[i][6];	// S
			gear_se[i][1] = gear[i][2];	// E
		}
		rotate(num - 1, dir);

		// 왼쪽 톱니바퀴들
		bool turn = true; int now_dir = dir == 1 ? -1 : 1;
		for (int i = num - 1; i > 0 && turn; i--) {
			if (gear_se[i][0] != gear_se[i - 1][1]) {
				rotate(i - 1, now_dir);
				now_dir = now_dir == 1 ? -1 : 1;
			}
			else turn = false;
		}

		// 오른쪽 톱니바퀴들
		turn = true; now_dir = dir == 1 ? -1 : 1;
		for (int i = num - 1; i < 3 && turn; i++) {
			if (gear_se[i][1] != gear_se[i + 1][0]) {
				rotate(i + 1, now_dir);
				now_dir = now_dir == 1 ? -1 : 1;
			}
			else turn = false;
		}
	}

	int ans = 0;
	for (int i = 0; i < 4; i++) ans += (gear[i][0] == '0' ? 0 : pow(2, i));
	cout << ans;
}

메인 함수에서 구현하는 것보다 별도의 함수로 빼는걸 좋아하는데.. 이건 간단해서 그냥 메인에서 해결했다.

14499 주사위 굴리기

코드

#include <bits/stdc++.h>
using namespace std;

int n, m, x, y, k;
int board[20][20];
int dx[5] = { 0, 0, 0, -1, 1 };
int dy[5] = { 0, 1, -1, 0, 0 };
int dice[6] = { 0, 0, 0, 0, 0, 0 };	// 위, 북, 동, 서, 남, 바닥

void rotate(int dir) {
	if (dir == 1) {
		int tmp = dice[0];
		dice[0] = dice[3];
		dice[3] = dice[5];
		dice[5] = dice[2];
		dice[2] = tmp;
	}
	else if (dir == 2) {
		int tmp = dice[0];
		dice[0] = dice[2];
		dice[2] = dice[5];
		dice[5] = dice[3];
		dice[3] = tmp;
	}
	else if (dir == 3) {
		int tmp = dice[0];
		dice[0] = dice[4];
		dice[4] = dice[5];
		dice[5] = dice[1];
		dice[1] = tmp;
	}
	else {
		int tmp = dice[0];
		dice[0] = dice[1];
		dice[1] = dice[5];
		dice[5] = dice[4];
		dice[4] = tmp;
	}
}

bool check(int nowx, int nowy, int dir) {
	int nextx = nowx + dx[dir];
	int nexty = nowy + dy[dir];
	return nextx >= 0 && nextx < n&& nexty >= 0 && nexty < m;
}

int main() {
	ios::sync_with_stdio(0);
	cin.tie(0);
	cin >> n >> m >> x >> y >> k;
	for (int i = 0; i < n; i++) {
		for (int j = 0; j < m; j++) {
			cin >> board[i][j];
		}
	}
	for (int i = 0; i < k; i++) {
		int dir;
		cin >> dir;
		if (check(x, y, dir)) {
			x += dx[dir];
			y += dy[dir];
			rotate(dir);
			if (board[x][y] == 0) board[x][y] = dice[5];
			else {
				dice[5] = board[x][y];
				board[x][y] = 0;
			}
			cout << dice[0] << "\n";
		}
	}
}

주사위 굴리는 행위가 매우 헷갈렸다😣 배열로 나열했을 때 규칙이 있을 줄 알고 1차원, 2차원 배열 모두 생각하며 규칙을 찾으려고 했으나 실패.

결국 약간의 인터넷의 도움을 받아 직접 그림으로 그려서 좌표 변환을 해주는 방식을 선택.

profile
HICE 19

0개의 댓글