<C/C++> BOJ 13460: ๊ตฌ์Šฌํƒˆ์ถœ

์˜ค๋Š˜๋ถ€ํ„ฐ ํ•˜๋ฃจ์— ํ•œ๋‘๋ฌธ์ œ์”ฉ ๊ฐœ๋ณ„์ ์œผ๋กœ ์•Œ๊ณ ๋ฆฌ์ฆ˜ ๋ฌธ์ œ๋ฅผ ํ’€์–ด๋ณด๋ ค๊ณ  ํ•ฉ๋‹ˆ๋‹ค!

 

#include <stdio.h>
#include <queue>
using namespace std;

#define MAXN 10
int N, M;
int RR, RC, BR, BC;
int rcnt, bcnt;
char map[MAXN + 5][MAXN + 5];
int visited[MAXN + 5][MAXN + 5][MAXN + 5][MAXN + 5];
struct DATA { int rr, rc, br, bc, t; };
queue<DATA> q;
static int dr[] = { -1, 1, 0, 0 };
static int dc[] = { 0, 0, -1, 1 };

void tilt(int &r, int &c, int &cnt, int i) {
	for (;;) {
		if (map[r][c] == 'O') break;
		if (map[r + dr[i]][c + dc[i]] == '#')break;
		r += dr[i];
		c += dc[i];
		cnt++;
	}
	
	//printf("%d %d %d\n", r, c, cnt);
}

int BFS(void) { // ๋ฌธ์ œ ๊ผผ๊ผผํžˆ ์ฝ๊ธฐ
	q = {};
	q.push({ RR, RC, BR, BC, 0 });
	visited[RR][RC][BR][BC] = 1;

	while (!q.empty()) {
		DATA cur = q.front(); q.pop();
		if (cur.t >= 10) break; //10ํšŒ ์ดˆ๊ณผ

		for (int i = 0; i < 4; i++) {
			int nrr = cur.rr, nrc = cur.rc, nbr = cur.br, nbc = cur.bc;
			rcnt = 0, bcnt = 0;
			tilt(nrr, nrc, rcnt, i);
			tilt(nbr, nbc, bcnt, i);
			//printf("%d %d %d: %d %d %d %d // %d %d %d %d \n", cur.t, rcnt, bcnt, cur.rr, cur.rc, cur.br, cur.bc, nrr, nrc, nbr, nbc);

			if (map[nbr][nbc] == 'O') continue; // ํŒŒ๋ž€๊ตฌ์Šฌ ๊ตฌ๋ฉ์— ๋“ค์–ด๊ฐ
			if (map[nrr][nrc] == 'O') return cur.t + 1; // ๋นจ๊ฐ„๊ตฌ์Šฌ ๊ตฌ๋ฉ์— ๋“ค์–ด๊ฐ
			if (nrr == nbr && nrc == nbc) { // ๊ฒน์น˜๋ฉด ๋”๋งŽ์ด ์›€์ง์ธ ๊ตฌ์Šฌ ํ•œ์นธ ์ด์ „์œผ๋กœ ๋ณด๋‚ด์ฃผ๊ธฐ
				if (rcnt > bcnt) nrr -= dr[i], nrc -= dc[i];
				else nbr -= dr[i], nbc -= dc[i];
			}
			if (visited[nrr][nrc][nbr][nbc]) continue; // ๋ฐฉ๋ฌธํ•œ ์  ์žˆ์œผ๋ฉด 

			visited[nrr][nrc][nbr][nbc] = 1;
			q.push({ nrr, nrc, nbr, nbc, cur.t + 1 });
		}
	}
	return -1;
}

void Solve(void) {
	for (int i = 2; i < N; i++) {
		for (int j = 2; j < M; j++) {
			if (map[i][j] == 'R') {
				RR = i, RC = j;
			}
			else if (map[i][j] == 'B') {
				BR = i, BC = j;
			}
		}
	}

	int ans = BFS();
	printf("%d\n", ans);
}

void InputData(void) {
	scanf("%d %d", &N, &M);
	for (int i = 1; i <= N; i++) {
		scanf("%s", &map[i][1]); // '&' ๊ผญ ๋ถ™์ด๊ธฐ
	}
}
int main(void) {
	InputData();
	Solve();
	return 0;
}

 

<What I learned>

๋ฌธ์ œ ๊ผผ๊ผผํžˆ ์ฝ์Ÿˆ...
์ด์ „์— ํ’€์—ˆ๋˜ ๋ฌธ์ œ(๊ตฌ์Šฌ ์ง‘์–ด๋„ฃ๊ธฐ)์™€ ๊ฑฐ์˜ ๋™์ผํ•ด์„œ ๋ฌธ์ œ๋ฅผ ๋Œ€์ถฉ ์ฝ์—ˆ๋‹ค.

ํ•œ์นธ์”ฉ ์›€์ง์ธ๋‹ค ์ƒ๊ฐํ•˜๊ณ  ํ’€์—ˆ๋‹ค.
ํ•˜์ง€๋งŒ ํ•œ๋ฒˆ ์›€์ง์ด๋ฉด ๋ชป์›€์ง์ผ ๋•Œ๊นŒ์ง€(๋ฒฝ์— ๋ถ€๋”ชํžˆ๊ฑฐ๋‚˜ ๊ตฌ์Šฌ์— ๋“ค์–ด๊ฐ„ ๊ฒฝ์šฐ) ๊ณ„์† ์›€์ง์ด๋Š” ๊ฒƒ์ด๊ธฐ์— 
๋ฐฉํ–ฅ ๊ฒฐ์ •ํ•ด์ฃผ๋Š” for๋ฌธ ์•ˆ์— while๋ฌธ์„ ์‚ฌ์šฉํ•ด์„œ ๋๊นŒ์ง€ ์›€์ง์—ฌ์ค˜์•ผ ํ•œ๋‹ค.

๊ตฌ์Šฌ์ด ๊ฒน์น˜๋Š” ๊ฒฝ์šฐ๊ฐ€ ์ƒ๊ฒผ์„ ๋•Œ ํ•œ ๊ตฌ์Šฌ์„ ์ด์ „์˜ ์ž๋ฆฌ๋กœ ์˜ฎ๊ฒจ์ค˜์•ผ ํ•˜๋Š”๋ฐ
๋นจ๊ฐ„ ๊ตฌ์Šฌ๊ณผ ํŒŒ๋ž€ ๊ตฌ์Šฌ ๊ฐ๊ฐ cnt๋ฅผ ๋น„๊ตํ•ด์„œ ๋” ํฐ ๊ฑธ ์ด์ „ ์ž๋ฆฌ๋กœ ์˜ฎ๊ฒจ์ค€๋‹ค.

์ด์ „ ํ’€์—ˆ๋˜ ๋ฌธ์ œ์™€ ๋‹ฌ๋ฆฌ ์œ ํšจ์„ฑ ๊ฒ€์‚ฌ ์ˆœ์„œ๋„ ์ค‘์š”
๊ฒน์ณค์„ ๊ฒฝ์šฐ ๊ทธ์— ๋งž๊ฒŒ ๋ฐ”๊ฟ”์ค€ ํ›„ ์œ ํšจ์„ฑ ๊ฒ€์‚ฌํ•˜๊ธฐ

'Coding Test' ์นดํ…Œ๊ณ ๋ฆฌ์˜ ๋‹ค๋ฅธ ๊ธ€

<C/C++> BOJ 13458 ์‹œํ—˜๊ฐ๋…  (0) 2022.03.30
<C/C++> BOJ 14499: ์ฃผ์‚ฌ์œ„ ๊ตด๋ฆฌ๊ธฐ  (0) 2022.03.30
LeetCode - Longest Common Prefix  (0) 2021.11.11
LeetCode - Roman to Integer  (0) 2021.11.10
LeetCode - Palindrome  (0) 2021.11.10