[๋ฌธ์ ]
N×M์ ํ๋ ฌ๋ก ํํ๋ ๋งต์์ (1, 1)์์ (N, M)๊น์ง ์ด๋ํ ๋ ๊ฑธ๋ฆฌ๋ ์ต๋จ ๊ฒฝ๋ก๋ฅผ ๊ตฌํ๋ ๋ฌธ์ .
์ด ๋, 0์ ์ด๋ํ ์ ์๋ ๊ณณ์ ๋ํ๋ด๊ณ , 1์ ์ด๋ํ ์ ์๋ ๋ฒฝ์ด ์๋ ๊ณณ์ ๋ํ๋ด๋ฉฐ 1ํ์ ํํ์ฌ ๋ฒฝ์ ๋ถ์๊ณ ์ด๋ํ ์ ์๋ค.
[ํ์ด]
Break ์ ๋ฌด๋ฅผ ์ ์ฅํด๋๊ณ ํ๋ฒ๋ ๊นฌ ์ ์๋ ๋ฒฝ์ ๊นจ๊ฐ๋ฉด์ ํ์ํด์ผ ํ ๊ฒ ๊ฐ์๋ฐ ๊ทธ ๊ตฌ์กฐ๋ฅผ ๋ชป์ง๊ฒ ์ด์ ํ์ฐธ์ ํค๋งธ๋ค.
๊ฒฐ๊ตญ ํ์ด ์ฐธ์กฐ...
์ด ๋ฌธ์ ์ ํต์ฌ์ ํ์ํ ๊ฒฝ๋ก๋ฅผ queue์ ์ ์ฅํ ๋, ๋ฒฝ์ ๋ถ์ ๊ฒฝ๋ก์ธ์ง ๋ฒฝ์ ๋ถ์์ง ์์ ๊ฒฝ๋ก์ธ์ง๋ ์ ์ฅํด์ค์ผ ํ๋ค๋ ์ ์ด๋ค. ๋ํ, ํ์ํ ๊ฒฝ๋ก๋ฅผ ๋ฐฉ๋ฌธ์ฒดํฌํ ๋ ๋ฒฝ์ ๋ถ์ ์ ์ด ์์ผ๋ฉด์ ๋ฐฉ๋ฌธํ ์๋ ์๊ณ ๋ฒฝ์ ๋ถ์์ ์ด ์์ผ๋ฉด์ ๋ฐฉ๋ฌธํ ์๋ ์๊ธฐ ๋๋ฌธ์ ๋ ๊ฐ์ง ๊ฒฝ์ฐ์ ์๋ฅผ ๋ชจ๋ ์ด์ด๋๊ณ ํ ๊ฒฝ์ฐ๋ง ๋ฐฉ๋ฌธ ์ฒดํฌํด์ค์ผํ๋ค๋ ์ ์ด๋ค.
์ด ๋, ๋ฒฝ์ ๋ถ์ ์ ์ด ์๋ค๋ฉด ๋ฒฝ์ด ์๋ ๊ฒฝ๋ก๋ฅผ ๊ณ์ํด์ ์ด๋ํ๋ฉด ๋๊ณ , ๋ฒฝ์ ๋ถ์ ์ ์ด ์๋ค๋ฉด ๋ฒฝ๊ณผ ๋ฒฝ์ด ์๋ ๊ณณ ๋ชจ๋ ์ด๋๊ฐ๋ฅํ๋ค.
์ฆ, ๊ฐ ์ ๋ค์ ์ขํ์ ๋ฒฝ์ ๋ถ์ ํ์, ์ด๋ ํ์ ์ ๋ณด๋ฅผ ๊ฐ๊ณ ์์ด์ผ ํ๋ค. ์ด๋ ํ์ ์ ๋ณด๋ ์ต๋จ๊ฒฝ๋ก๊ธธ์ด๋ฅผ ์ฐพ์์ผํ๊ธฐ ๋๋ฌธ์ ์ ์ฅํด์คฌ๋ค. ํ์ํ ๋๋ง๋ค +1์ฉํด์ ๊ฒฝ๋ก ๊ธธ์ด๋ฅผ ์ฐพ๋๋ค.
class Point {
public:
int x;
int y;
int breakCount;//๋ฒฝ์ ๋ถ์ ํ์. 0 or 1๋ก ํํ
int count;//์ด๋ ํ์. ๋์ค์ ์ถ๋ ฅํด์ค์ผ ํจ.
Point(int x, int y, int breakCount, int count) {
this->x = x;
this->y = y;
this->breakCount = breakCount;
this->count = count;
}
};
๊ทธ๋ฆฌ๊ณ ๋ฒฝ์ ๋ซ์ ์ ์ด ์๋ ๊ฒฝ๋ก๊ฐ ๋ฐฉ๋ฌธ์ฒดํฌ๋ฅผ ํ๋ฉฐ ํ์ํ๋ ๊ฒฝ์ฐ์ ๋ฒฝ์ ๋ซ์ ์ ์๋ ๊ฒฝ๋ก๊ฐ ๋ฐฉ๋ฌธ์ฒดํฌํ๋ฉฐ ํ์ํ๋ ๊ฒฝ์ฐ. 2๊ฐ์ง๋ก ๋๋๊ธฐ ๋๋ฌธ์ visited ๋ฐฐ์ด์ 2๊ฐ ๋ง๋ค์ด์ค์ผ ํ๋ค. ๊ทธ ๋ฐฐ์ด์ 3์ฐจ์ ํ๋ ฌ๋ก ํํํ๋ค. ๋ฒฝ์ ๋ซ์ ์ ์์ผ๋ฉด์ ๋ฐฉ๋ฌธํ๋ค๋ฉด visited[x][y][0] = true๋ก, ๋ฒฝ์ ๋ซ์ ์ ์์ผ๋ฉด์ ๋ฐฉ๋ฌธํ๋ค๋ฉด visited[x][y][1] = true ๋ก ์ฒดํฌํ ๊ฑฐ๋ค.
bool visited[MAX_VALUE][MAX_VALUE][2] = { false, };
์ฌ๊ธฐ์ ์ง๋ฌธ์ด ์์ ๊ฒ์ด๋ค. (๋๋ ๊ณ์ ์ดํด๊ฐ ์๊ฐ๋ ๋ถ๋ถ!!) ๋ฒฝ์ ๋ซ์ ๋, ํญ์ ์ต์ ์ด ๋๋ ๊ฒฝ์ฐ๋ฅผ ๋ซ์ด์ผ ํ ํ ๋ฐ, ์์์ ๋ซ์ ๊ฒฝ์ฐ๋ณด๋ค ๋ค์์ ๋ซ์ ๊ฒฝ์ฐ๊ฐ ๋ ์ต์ ์ด๋ฉด ์ด๋กํ์ง????
๊ฒฐ๋ก ์ ์๊ด์๋ค !!! ๋ค์ ๋์ค๋ ์ต์ ์ ๊ฒฝ์ฐ๋ ๋ฒฝ์ ๋ซ์ ์ ์๋ ๊ฒฝ๋ก๊ฐ ์ฌํ์ํด์ค ๊ฒ์ด๊ธฐ ๋๋ฌธ์ด๋ค !!!!!
์๋ ์์ ๋ฅผ ๋ณด๋ฉฐ ์ดํดํด๋ณด์.
์์ 1๋ฒ์ ํ์ด๋ณด๋ฉด ๋ค์๊ณผ ๊ฐ๋ค.
queue์ ์ ์ฅ๋๋ ์ธ์ 3๊ฐ๋ Point์ ๋ณด๋ฅผ ์๋ฏธํ๋๋ฐ ์์๋๋ก Point(x์ขํ, y์ขํ, ๋ฒฝ์ ๋ถ์ ํ์)์ด๋ค.
์ฆ, ๋งจ ์ฒ์์ ํ์ ์ ์ฅ๋๋ ๊ฐ์ x์ขํ 1, y์ขํ 1, ๋ฒฝ์ ๋ถ์ ํ์ 0์ ์ ์ฅํ๋ค.
๊ทธ๋ฆฌ๊ณ (1, 1)๋ถํฐ ์ค๋ฅธ์ชฝ, ์๋, ์ผ์ชฝ, ์ ์์ผ๋ก ์ฃผ๋ณ์ ํ์ํ๋ค.
(1, 1) ์ฃผ์ ์ขํ์ธ (1, 2)์ (2, 1)์ ํ์ํ๋๋ฐ, ์์ง ๋ฒฝ์ ๋ถ์ ํ์๊ฐ 0์ด๋ฏ๋ก ๋ฒฝ์ ๋ง๋ฌ์ ๋ ๋ฒฝ์ ๋ถ์ ์ ์๋ค.
๋ฐ๋ผ์ ๋ฒฝ์ ๋ถ์๊ณ ๋ค์ ๊ฒฝ๋ก๋ก ์ด๋ํ ๊ฒ์ด๋ค. ์ฆ, visited[1][2][1] = visited[2][1][1] = true๋ก ๋ฐฉ๋ฌธ ์ฒดํฌํด์ฃผ๊ณ queue์ Point(1, 2, 1)๊ณผ Point(2, 1, 1)์ ๋ฃ๋๋ค.
๋ค์ queue์ ๋งจ ์์ ์๋ Point(1, 2, 1)์ ๊บผ๋ด์ ํ์์ ์งํํ ๊ฑด๋ฐ,
์ด๋ฏธ ์์์ ๋ฒฝ์ ๋ถ์ ์ ์ด ์์ผ๋ฏ๋ก(3๋ฒ์งธ ์ธ์๊ฐ 1์ด๋ฏ๋ก) ๋ค์ ๊ฒฝ๋ก์์ ๋ฒฝ์ด ์๋ ๊ฒฝ๋ก(map[x][y] = 0)๋ง ํ์์ด ๊ฐ๋ฅํ๋ค. ๊ทธ๋ฆฌ๊ณ ๋ฒฝ์ ๋ถ์ ์ ์ด ์์ผ๋ฏ๋ก breakedCount๋ฅผ +1 ํด์ค ์ํ์ธ Point(1, 3, 1) ๋ฅผ queue์ ์ ์ฅํ๊ณ ๋ฒฝ์ ๋ถ์๊ณ ๋ฐฉ๋ฌธํ๋ค๋ ํ์๋ก visited[1][3][1] = true๋ก ๋ฐฉ๋ฌธ ์ฒดํฌ ํด์ค๋ค.
๊ทธ ๋ค๋ก๋ ๋ฒฝ์ ๋ถ์ ์ ์๋ ํ์๊ฐ 0์ด๋ฏ๋ก ๋ฒฝ์ด ์๋ ๊ฒฝ๋ก๋ง ํ์ํ๋ฉฐ (N, M) ์ขํ์ ๋๋ฌํ ๊ฒ์ด๋ค.
๋ค๋ฅธ ์์ ๋ ์ดํด๋ณด์.
์ ์์ ๋ ๋งจ ์ฒ์๋ถํฐ ๋ฒฝ์ ๋ซ์ง ์๋๋ค. ๋ฒฝ์ ๋ซ๊ฑฐ๋ ๋ซ์ง ์์ผ๋ฉด์ N x M ์์น๊น์ง ๊ฐ๋ ๊ฑฐ๋ค.
Point(1, 1, 0) ์ขํ๋ฅผ ํ์ํ๊ณ , Point(1, 2, 0) ์ขํ์ Point(2, 1, 0) ์ขํ๋ฅผ ํ์ ๋ฃ๋๋ค. ๊ทธ๋ฆฌ๊ณ visited[1][2][0] = visited[2][1][0] = true๋ก ๋ฐฉ๋ฌธ ์ฒดํฌํ๋ค. ์์ง ๋ฒฝ์ ๋ซ์ ์ ์ด ์์ผ๋ฏ๋ก ๋ ์ขํ ๋ชจ๋ 3๋ฒ์งธ ์ธ์(๋ฒฝ์ ๋ซ์ ํ์)๋ 0์ด์ด๊ณ ๋ฒฝ์ ๋ซ์ง ์๊ณ ์ด๋ํ ๊ฒฝ๋ก์ ๋ฐฉ๋ฌธ์ฒดํฌํด์ฃผ๋ ๊ฑฐ๋ค.
๋ค์ queue์ ์ ์ผ ์์ ์๋ ์ขํ์ธ Point(1, 2, 0)๋ฅผ ํ์ํ์. ์ด ๋๋ (1, 3)์ขํ์ (2, 2)์ขํ๋ฅผ ํ์ํ ์ ์๋๋ฐ, (1, 3)์ขํ๋ก ์ด๋ํ ๊ฒฝ์ฐ๋ ๋ฒฝ์ ๋ซ์ง ์๊ณ ์ด๋ํ ์ ์๊ณ , (2, 2)์ขํ๋ก ์ด๋ํ ๋๋ ๋ฒฝ์ ๋ซ์ด์ผ๋ง ์ด๋ ๊ฐ๋ฅ ํ๋ค. Point(1, 2, 0) ๊ฐ์ 3๋ฒ์งธ ์ธ์๋ฅผ ํตํด ์ด ๊ฒฝ๋ก๋ ๋ฒฝ์ ๋ซ์ ์ ์ด ์์ผ๋ฏ๋ก ๋ ์ขํ ๋ชจ๋ queue์ ์ ์ฅํ๋ค. ์ด ๋, (1, 3)์ผ๋ก ์ด๋ํ๋ ๊ฒฝ๋ก๋ ๋ฒฝ์ ๋ซ์ ์ ์์ผ๋ฏ๋ก Point(1, 3, 0)์ ๊ฐ์, (2, 2)๋ก ์ด๋ํ๋ ๊ฒฝ๋ก๋ ๋ฒฝ์ ๋ซ์ด์ผ ํ๋ฏ๋ก Point(2, 2, 1)๋ก ํํ ๋ฐ queue์ ์ ์ฅํ๋ค. ๊ทธ๋ฆฌ๊ณ visited[1][3][0] = visited[2][2][1] = true ๋ก ๊ฐ๊ฐ ๋ฒฝ์ ๋ซ์ ์ ์์ผ๋ฉด์ ๋ฐฉ๋ฌธํ ๊ฒฝ๋ก์ ๋ฒฝ์ ๋ซ์ผ๋ฉด์ ๋ฐฉ๋ฌธํ ๊ฒฝ๋ก๋ฅผ ๋ฐฉ๋ฌธ์ฒดํฌํด์ค๋ค.
๋ค์ queue์ ๋งจ ์์ ๊ฐ์ธ Point(2, 1, 0)์ ํ์ํ์. Point(2, 1, 0)์ ๊ฐ์ ๋ณด๋ฉด ์ ์ ์๋์ ์ง๊ธ๊น์ง ๋ฒฝ์ ๋ซ์ ์ ์๋ ๊ฒฝ๋ก๋ฅผ ์ ์ฅํ ๊ฒ์ด๋ค. ์์ง ๋ฒฝ์ ๋ซ์ ์ ์ด ์์ผ๋ฏ๋ก (2, 2)์ขํ์ (3,1)์ขํ ๋ชจ๋ ๊ฐ๋ฅํ ํ ๋ฐ, (2, 2) ์ขํ๋ก ์ด๋ํ ๊ฒฝ์ฐ ๋ฒฝ์ ๋ซ์ ์ ์๋ค๋ ํ์๋ฅผ ํด์ค์ผ ํ๋ค. Point(2, 2, 1) ์ด๋ ๊ฒ. ๊ทผ๋ฐ (2, 2, 1)์ ์ด๋ฏธ (1, 2)์ขํ์์ ํ์ํ ๋ visited[2][2][1] = true๋ก ์ฒดํฌํด์ฃผ๊ณ queue์ ๋ฃ์ด์คฌ๋ค. ๋ฐ๋ผ์ ์ด๋ฏธ ์ด๋ฒ ๊ฒฝ๋ก์์๋ Point(3, 1, 0)๋ง ์ ์ฅํ๊ณ ๋ฒฝ์ ๋ซ์ ์ ์์ผ๋ฉด์ ๋ฐฉ๋ฌธํ๋ค๋ ํ์๋ก visited[3][1][0] = true ๋ก ์ฒดํฌํด์ค๋ค.
๊ทธ ๋ค์์ Point(1,3,0)๋ฅผ ํ์ํ๋ค. (1, 4) ์ขํ์, (2, 3) ์ขํ๋ฅผ ํ์ํ ํ ๋ฐ, (1, 4)์ขํ๋ ๋ฒฝ์ด ์๋ ๊ฒฝ๋ก๋ฅผ ์ฒดํฌํ๋ ๋ฐฐ์ด์ ๋ฐฉ๋ฌธ์ฒดํฌํด์ฃผ๊ณ , (2, 3)์ขํ๋ ๋ฒฝ์ ๋ซ์ด์ผ ํ๋ฏ๋ก ๋ฒฝ์ธ ๊ฒฝ๋ก๋ฅผ ์ฒดํฌํ๋ ๋ฐฐ์ด์ ๋ฐฉ๋ฌธ์ฒดํฌํด์ค๋ค. ์ฆ visited[1][4][0] = visited[2][3][1] = true์ด๊ณ , queue์ Point(1, 4, 0)๊ณผ Point(2, 3, 1) ๊ฐ์ด ์ ์ฅ๋๋ค.
Point(2, 2, 1)์ ๋ฒฝ์ ๋ถ์ ์ ์๋ ์ด๋๊ฒฝ๋ก ์ด๋ฏ๋ก visited[2][3][1] = visited[3][2][1]= true๋ก ์ฒดํฌํด์ฃผ๊ณ , Point(2, 3, 1)๊ณผ Point(3, 2, 1)์ queue์ ๋ฃ๋๋ค.
Point(3, 1, 0)์ ๋ฒฝ์ ๋ถ์ ์ ์๋ ์ด๋๊ฒฝ๋ก ์ด๋ฏ๋ก visited[3][2][0] = visited[4][1][0] = true๋ก ์ฒดํฌํด์ฃผ๊ณ queue์ Point(3, 2, 0)๊ณผ Point(4, 1, 0)์ ๋ฃ์ด์ค๋ค.
์ฌ๊ธฐ์ queue์ Point(3, 2, 1)๊ณผ Point(3, 2, 0)์ด ์๋ ๊ฒ์ด ๋ณด์ผ ๊ฒ์ด๋ค. ์ด๋ ๊ฒ ๋ฒฝ์ ๋ถ์๋ฉฐ ํ์ํ๋ ๊ฒฝ๋ก์ ๋ฒฝ์ ๋ถ์์ง ์๊ณ ํ์ํ๋ ๊ฒฝ์ฐ ๋๋ค๋ฅผ ํ์ธํ๊ธฐ ๋๋ฌธ์ ๋ ๋ค์ ๊ฒฝ์ฐ์์ ์ต๋จ๊ฒฝ๋ก๋ฅผ ํ์ ํ ์ ์๋ ๊ฒ์ด๋ค.
๊ทธ ๋ค๋ก ์ ๊ณผ์ ์ ๊ณ์ ๋ฐ๋ณตํ๋ค.
queue์ ๊ฐ์ด ๋ชจ๋ ๋น ์ง๊ณ ํ์ฌ ์ขํ๊ฐ (N,M)์ด ๋๋ฉด ํ์ฌ๊น์ง ๊ตฌํ ๊ฒฝ๋ก๊ธธ์ด๋ฅผ ๋ฐํํด์ค๋ค!
[์ฝ๋]
#include <iostream>
#include <queue>
#include <algorithm>
using namespace std;
const int MAX_VALUE = 1001;
int direction[4][2] = { {0,1}, {1,0},{0,-1},{-1,0} };//์ด๋ ๋ฐฉํฅํค: ์ค๋ฅธ์ชฝ, ์๋, ์ผ์ชฝ, ์
class Point {
public:
int x;
int y;
int breakCount;//๋ฒฝ์ ๋ถ์ ํ์. 0 or 1๋ก ํํ
int count;//์ด๋ ํ์. ๋์ค์ ์ถ๋ ฅํด์ค์ผ ํจ.
Point(int x, int y, int breakCount, int count) {
this->x = x;
this->y = y;
this->breakCount = breakCount;
this->count = count;
}
};
int MoveByBFS(int N, int M, int map[MAX_VALUE][MAX_VALUE]);//BFS๋ฅผ ํตํ ์ต๋จ๊ฑฐ๋ฆฌ ์ฐพ๊ธฐ ์ํ
int main() {
int N, M;
cin >> N >> M;
int map[MAX_VALUE][MAX_VALUE] = { 0, };
for (int i = 0; i < N; i++) {
for (int j = 0; j < M; j++) {
scanf_s("%1d", &map[i][j]);
}
}
cout << MoveByBFS(N, M, map);
return 0;
}
int MoveByBFS(int N, int M, int map[MAX_VALUE][MAX_VALUE]) {
queue<Point> q;
bool visited[MAX_VALUE][MAX_VALUE][2] = { false, };
q.push(Point(0,0,0,1));
visited[0][0][0] = true;//๋ฒฝ์ ๋ถ์ ํ์๊ฐ 0์ด๋ฉด์ ํด๋น ์ขํ์ ๋ฐฉ๋ฌธํ์์ ๋ํ๋
visited[0][0][1] = true;//๋ฒฝ์ ๋ถ์ ํ์๊ฐ 1์ด๋ฉด์ ํด๋น ์ขํ์ ๋ฐฉ๋ฌธํ์์ ๋ํ๋
while (!q.empty()) {
Point currentPoint = q.front();
q.pop();
if (currentPoint.x == N - 1 && currentPoint.y == M - 1) {
return currentPoint.count;
}
for (int i = 0; i < 4; i++) {
int nx = currentPoint.x + direction[i][0];
int ny = currentPoint.y + direction[i][1];
if (nx < N && nx >= 0 && ny < M && ny >= 0) {
if (!visited[nx][ny][0]) {//๋ฒฝ ๋ถ์ ํ์๊ฐ 0์ด๋ฉด์ ํด๋น ์ขํ์ ๋ฐฉ๋ฌธํ ์ ์ด ์๋ ๊ฒฝ์ฐ
if (map[nx][ny] == 0 && currentPoint.breakCount == 0) {//ํด๋น ์ขํ์ ๋ฒฝ์ด ์๊ณ ์ด์ ๊น์ง ๋ฒฝ ๋ถ์ ํ์๋ 0์ผ ๊ฒฝ์ฐ๋ง push
visited[nx][ny][0] = true;
q.push(Point(nx, ny, 0, currentPoint.count + 1));
}
}
if (!visited[nx][ny][1]) {//๋ฒฝ ๋ถ์ ํ์๊ฐ 1์ด๋ฉด์ ํด๋น ์ขํ์ ๋ฐฉ๋ฌธํ ์ ์ด ์๋ ๊ฒฝ์ฐ
if ((map[nx][ny] == 1 && currentPoint.breakCount == 0)//ํด๋น ์ขํ์ ๋ฒฝ์ด ์๊ณ ๋ฒฝ ๋ถ์ ํ์๊ฐ 0์ธ ๊ฒฝ์ฐ
|| (map[nx][ny] == 0 && currentPoint.breakCount == 1)) {//or ํด๋น ์ขํ์ ๋ฒฝ์ด ์๊ณ ๋ฒฝ ๋ถ์ ํ์๊ฐ 1์ธ ๊ฒฝ์ฐ
visited[nx][ny][1] = true;
q.push(Point(nx, ny, 1, currentPoint.count + 1));
}
}
}
}
}
return -1;
}
'๐ Coding Test Study > Algorithm Problem' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[C++][Baekjoon][Math] 1978๋ฒ ์์์ฐพ๊ธฐ (0) | 2022.04.03 |
---|---|
[C++][BAEKJOON] 9613๋ฒ GCDํฉ (0) | 2022.04.02 |
[C++][BAEKJOON][์ํ] 1041๋ฒ ์ฃผ์ฌ์ ๋ฌธ์ ํ์ด & ๋ฐ๋ก (0) | 2021.10.11 |
[C++][BAKJOON][์ํ] 1541๋ฒ ์์ด๋ฒ๋ฆฐ ๊ดํธ ํ์ด & ๋ฐ๋ก (0) | 2021.10.11 |
[C++][BAEKJOON][Bruteforce] 2580๋ฒ ์ค๋์ฟ ํ์ด & ๋ฐ๋ก (0) | 2021.10.11 |