์๊ฐ์ ํ
1์ด
๋ฌธ์
ํ๋ฏผ์ด๋ ๊ฒ์ ์บ๋ฆญํฐ๊ฐ ๋งต ์์์ ์์ง์ด๋ ์์คํ ์ ๊ฐ๋ฐ ์ค์ด๋ค.
์บ๋ฆญํฐ๊ฐ ์๋ ์ฅ์๋ 1 x 1 ํฌ๊ธฐ์ ์ ์ฌ๊ฐํ์ผ๋ก ์ด๋ค์ง N x M ํฌ๊ธฐ์ ์ง์ฌ๊ฐํ์ผ๋ก, ๊ฐ๊ฐ์ ์นธ์ ์ก์ง ๋๋ ๋ฐ๋ค์ด๋ค. ์บ๋ฆญํฐ๋ ๋์๋จ๋ถ ์ค ํ ๊ณณ์ ๋ฐ๋ผ๋ณธ๋ค.
๋งต์ ๊ฐ ์นธ์ (A, B)๋ก ๋ํ๋ผ ์ ์๊ณ , A๋ ๋ถ์ชฝ์ผ๋ก๋ถํฐ ๋จ์ด์ง ์นธ์ ๊ฐ์, B๋ ์์ชฝ์ผ๋ก๋ถํฐ ๋จ์ด์ง ์นธ์ ๊ฐ์์ด๋ค.
์บ๋ฆญํฐ๋ ์ํ์ข์ฐ๋ก ์์ง์ผ ์ ์๊ณ , ๋ฐ๋ค๋ก ๋์ด ์๋ ๊ณต๊ฐ์๋ ๊ฐ ์ ์๋ค.
์บ๋ฆญํฐ์ ์์ง์์ ์ค์ ํ๊ธฐ ์ํด ์ ํด ๋์ ๋งค๋ด์ผ์ ์ด๋ฌํ๋ค.
1. ํ์ฌ ์์น์์ ํ์ฌ ๋ฐฉํฅ์ ๊ธฐ์ค์ผ๋ก ์ผ์ชฝ ๋ฐฉํฅ(๋ฐ์๊ณ ๋ฐฉํฅ์ผ๋ก 90๋ ํ์ ํ ๋ฐฉํฅ)๋ถํฐ ์ฐจ๋ก๋๋ก ๊ฐ ๊ณณ์ ์ ํ๋ค.
2. ์บ๋ฆญํฐ์ ๋ฐ๋ก ์ผ์ชฝ ๋ฐฉํฅ์ ์์ง ๊ฐ๋ณด์ง ์์ ์นธ์ด ์กด์ฌํ๋ค๋ฉด, ์ผ์ชฝ ๋ฐฉํฅ์ผ๋ก ํ์ ํ ๋ค์ ์ผ์ชฝ์ผ๋ก ํ ์นธ์ ์ ์งํ๋ค.
์ผ์ชฝ ๋ฐฉํฅ์ ๊ฐ๋ณด์ง ์์ ์นธ์ด ์๋ค๋ฉด, ์ผ์ชฝ ๋ฐฉํฅ์ผ๋ก ํ์ ๋ง ์ํํ๊ณ 1๋จ๊ณ๋ก ๋์๊ฐ๋ค.
3. ๋ง์ฝ ๋ค ๋ฐฉํฅ ๋ชจ๋ ์ด๋ฏธ ๊ฐ๋ณธ ์นธ์ด๊ฑฐ๋ ๋ฐ๋ค๋ก ๋์ด ์๋ ์นธ์ธ ๊ฒฝ์ฐ์๋, ๋ฐ๋ผ๋ณด๋ ๋ฐฉํฅ์ ์ ์งํ ์ฑ๋ก ํ ์นธ ๋ค๋ก ๊ฐ๊ณ 1๋จ๊ณ๋ก ๋์๊ฐ๋ค. ๋จ, ์ด๋ ๋ค์ชฝ ๋ฐฉํฅ์ด ๋ฐ๋ค์ธ ์นธ์ด๋ผ ๋ค๋ก ๊ฐ ์ ์๋ ๊ฒฝ์ฐ์๋ ์์ง์์ ๋ฉ์ถ๋ค.
ํ๋ฏผ์ด๋ ์ ๊ณผ์ ์ ๋ฐ๋ณต์ ์ผ๋ก ์ํํ๋ฉด์ ์บ๋ฆญํฐ์ ์์ง์์ ์ด์์ด ์๋์ง ํ ์คํธํ๋ ค๊ณ ํ๋ค.
๋งค๋ด์ผ์ ๋ฐ๋ผ ์บ๋ฆญํฐ๋ฅผ ์ด๋์ํจ ๋ค์, ์บ๋ฆญํฐ๊ฐ ๋ฐฉ๋ฌธํ ์นธ์ ์๋ฅผ ์ถ๋ ฅํ๋ ํ๋ก๊ทธ๋จ์ ๋ง๋์์ค.
์ ๋ ฅ
- ์ฒซ์งธ ์ค์ ๋งต์ ์ธ๋ก ํฌ๊ธฐ N๊ณผ ๊ฐ๋ก ํฌ๊ธฐ M์ ๊ณต๋ฐฑ์ผ๋ก ๊ตฌ๋ถํ์ฌ ์ ๋ ฅํ๋ค. (3 <= N, M <= 50)
- ๋์งธ ์ค์ ๊ฒ์ ์บ๋ฆญํฐ๊ฐ ์๋ ์นธ์ ์ขํ (A, B)์ ๋ฐ๋ผ๋ณด๋ ๋ฐฉํฅ d๊ฐ ๊ฐ๊ฐ ์๋ก ๊ณต๋ฐฑ์ผ๋ก ๊ตฌ๋ถํ์ฌ ์ฃผ์ด์ง๋ค.
๋ฐฉํฅ ์ ์ ๊ฐ์ผ๋ก๋ ๋ค์๊ณผ ๊ฐ์ด 4๊ฐ์ง๊ฐ ์กด์ฌํ๋ค.(0: ๋ถ์ชฝ , 1: ๋์ชฝ , 2: ๋จ์ชฝ , 3: ์์ชฝ)
- ์ ์งธ ์ค๋ถํฐ ๋งต์ด ์ก์ง์ธ์ง ๋ฐ๋ค์ธ์ง์ ๋ํ ์ ๋ณด๊ฐ ์ฃผ์ด์ง๋ค. N๊ฐ์ ์ค์ ๋งต์ ์ํ๊ฐ ๋ถ์ชฝ๋ถํฐ ๋จ์ชฝ ์์๋๋ก, ๊ฐ ์ค์ ๋ฐ์ดํฐ๋ ์์ชฝ๋ถํฐ ๋์ชฝ ์์๋๋ก ์ฃผ์ด์ง๋ค. ๋งต์ ์ธ๊ณฝ์ ํญ์ ๋ฐ๋ค๋ก ๋์ด ์๋ค. (0: ์ก์ง , 1: ๋ฐ๋ค)
- ์ฒ์์ ๊ฒ์ ์บ๋ฆญํฐ๊ฐ ์์นํ ์นธ์ ์ํ๋ ํญ์ ์ก์ง์ด๋ค.
์ ๋ ฅ ์์
4 4
1 1 0
1 1 1 1
1 0 0 1
1 1 0 1
1 1 1 1
์ถ๋ ฅ
์ฒซ์งธ ์ค์ ์ด๋์ ๋ง์น ํ ์บ๋ฆญํฐ๊ฐ ๋ฐฉ๋ฌธํ ์นธ์ ์๋ฅผ ์ถ๋ ฅํ๋ค.
์ถ๋ ฅ ์์
3
๋ฌธ์ ํ์ด ๊ณผ์
๋งต์ ๊ตฌ์กฐ๋ฅผ 2์ฐจ์ ๋ฐฐ์ด์ ์ ์ฅ
int[][] map = new int[N][M];
for (int i = 0; i < N; i++) {
st = new StringTokenizer(br.readLine());
for (int j = 0; j < M; j++) {
map[i][j] = Integer.parseInt(st.nextToken());
}
}
์ธ๋ก ํฌ๊ธฐ N, ๊ฐ๋ก ํฌ๊ธฐ M๋งํผ์ ๋ฐฐ์ด์ ํ ๋นํ ํ 2์ค for๋ฌธ์ ํตํด ๋งต์ ๊ตฌ์กฐ๋ฅผ 2์ฐจ์ ๋ฐฐ์ด์ ์ ์ฅํ๋ค.
๋ฐฉํฅ์ ์ค์ ํ๋ dx, dy ๋ฐฐ์ด ๋ง๋ค๊ธฐ
์บ๋ฆญํฐ๋ ์ํ์ข์ฐ๋ก ์์ง์ผ ์ ์๋ค.
์์ ์กฐ๊ฑด์ ๋ฐ๋ผ ์บ๋ฆญํฐ๋ ๋ถ์ชฝ, ๋์ชฝ, ๋จ์ชฝ, ์์ชฝ์ผ๋ก ์ด๋์ด ๊ฐ๋ฅํ๋ค.
์๋ฅผ ๋ค์ด ์กฐ๊ธ ๋ ์์ธํ ์ดํด๋ณด๋ฉด
ํ์ฌ ์บ๋ฆญํฐ์ ์์น (1, 1)
๋ถ์ชฝ์ผ๋ก ์ด๋ํ ๊ฒฝ์ฐ: (0, 1) -> ํ -1
๋์ชฝ์ผ๋ก ์ด๋ํ ๊ฒฝ์ฐ: (1, 2) -> ์ด +1
๋จ์ชฝ์ผ๋ก ์ด๋ํ ๊ฒฝ์ฐ: (2, 1) -> ํ +1
์์ชฝ์ผ๋ก ์ด๋ํ ๊ฒฝ์ฐ: (1, 0) -> ์ด -1
์ด๋ ๊ฒ ํ(x), ์ด(y)์ ์ขํ๊ฐ ๋ณํ๋ ๊ฒ์ ์ ์ ์๋ค.
์ด๋ฅผ ํตํ์ฌ dx, dy๋ฐฐ์ด์ ๋ง๋ ๋ค.
int[] dx = {-1, 0, 1, 0};
int[] dy = {0, 1, 0, -1};
์บ๋ฆญํฐ ๋งค๋ด์ผ ๋ถ์
๋งค๋ด์ผ์ ์ฐจ๊ทผ์ฐจ๊ทผ ์ฝ๋๋ก ๊ตฌํํด ๋ณด์.
1๋จ๊ณ
ํ์ฌ ์์น์์ ํ์ฌ ๋ฐฉํฅ์ ๊ธฐ์ค์ผ๋ก ์ผ์ชฝ ๋ฐฉํฅ(๋ฐ์๊ณ ๋ฐฉํฅ์ผ๋ก 90๋ ํ์ ํ ๋ฐฉํฅ)๋ถํฐ ์ฐจ๋ก๋๋ก ๊ฐ ๊ณณ์ ์ ํ๋ค.
์ ๋ ฅ ๊ฐ์ ๋ฐ์ผ๋ฉด ์บ๋ฆญํฐ์ ๋ฐฉํฅ์ ์ ์ ์๋ค. ํด๋น ๋ฐฉํฅ์ ๊ธฐ์ค์ผ๋ก ์ผ์ชฝ์ผ๋ก ํ์ ํ๋ค.
๋ง์ฝ ์บ๋ฆญํฐ์ ๋ฐฉํฅ์ด ๋ถ์ชฝ์ธ ๊ฒฝ์ฐ, ๋ถ -> ์ -> ๋จ -> ๋ -> ๋ถ์ผ๋ก ํ์ ํ๋ค.
ํด๋น ๋ฐฉํฅ์ ๊ฐ๊ณผ ํจ๊ป ๋ณด๋ฉด 0 -> 3 -> 2 -> 1 -> 0์ด ๋๋ค.
๊ท์น์ ์ฐพ์๋ณด๋ฉด d๊ฐ 0์ธ ๊ฒฝ์ฐ๋ 3์ด ๋๊ณ ์ด๋ฅผ ์ ์ธํ ๊ฒฝ์ฐ๋ d - 1์ด๋ค.
d -= 1;
if (d == -1) {
d = 3;
}
2๋จ๊ณ
์บ๋ฆญํฐ์ ๋ฐ๋ก ์ผ์ชฝ ๋ฐฉํฅ์ ์์ง ๊ฐ๋ณด์ง ์์ ์นธ์ด ์กด์ฌํ๋ค๋ฉด, ์ผ์ชฝ ๋ฐฉํฅ์ผ๋ก ํ์ ํ ๋ค์ ์ผ์ชฝ์ผ๋ก ํ ์นธ์ ์ ์งํ๋ค. ์ผ์ชฝ ๋ฐฉํฅ์ ๊ฐ๋ณด์ง ์์ ์นธ์ด ์๋ค๋ฉด, ์ผ์ชฝ ๋ฐฉํฅ์ผ๋ก ํ์ ๋ง ์ํํ๊ณ 1๋จ๊ณ๋ก ๋์๊ฐ๋ค.
์ด์ ๋ ์บ๋ฆญํฐ์ ๋ฐฉํฅ๋๋ก ์์ผ๋ก ํ ์นธ ๋์๊ฐ๋ณผ ์ฐจ๋ก์ด๋ค.
์กฐ๊ฑด์ ๋ฐ๋ฅด๋ฉด ์ก์ง์ธ ์์ง ๊ฐ๋ณด์ง ์์ ์นธ๋ง ์บ๋ฆญํฐ๋ ์ ์งํ ์ ์๋ค.
์์์ ๊ตฌํํ dx, dy๋ฐฐ์ด์ ํ์ฉํ์ฌ ๋ค์ x, y์ขํ๋ฅผ ๊ตฌํ๋ค.
int nx = A + dx[d];
int ny = B + dy[d];
์ต์ข ์ถ๋ ฅ ๊ฐ์ ์บ๋ฆญํฐ๊ฐ ๋ฐฉ๋ฌธํ ์นธ์ ์์ด๋ค.
์ฒ์ ์บ๋ฆญํฐ๊ฐ ์์๋ ์นธ์ ๋ฐ๋์ ๋ฐฉ๋ฌธํ๊ฒ ๋๋ฏ๋ก moveCount๋ฅผ 1๋ก ์ด๊ธฐํํ๋ค.
๋ํ ์บ๋ฆญํฐ๋ ๊ฐ๋ณด์ง ์์ ์นธ๋ง ์ ์งํ ์ ์์ผ๋ฏ๋ก ์ฒ์ ์นธ์ -1๋ก ๋ฐ๋ก ์ฒดํฌํ๋ค.
int moveCount = 1;
map[A][B] = -1;
map์์ ์บ๋ฆญํฐ๊ฐ ๋ฐฉ๋ฌธํ ๊ฒฝ์ฐ๋ -1์ด๊ณ ๋ฐ๋ค์ธ ๊ฒฝ์ฐ๋ 1์ด๋ฏ๋ก ๋ค์ ์นธ์ ๊ฐ์ด 0์ธ ๊ฒฝ์ฐ๊ฐ "์ก์ง์ธ ์์ง ๊ฐ๋ณด์ง ์์ ์นธ"์ด ๋๋ค.
ํด๋น ์นธ์ ์ ์งํ ๊ฒฝ์ฐ ๊ทธ ์นธ์ -1๋ก ๋ฐฉ๋ฌธ์ฒ๋ฆฌ ํ ํ ํ์ฌ ์บ๋ฆญํฐ์ ์ขํ๋ก ๋ฐ๊พผ๋ค.
์บ๋ฆญํฐ๋ ์๋ก์ด ์นธ์ ๋ฐฉ๋ฌธํ์ผ๋ฏ๋ก moveCount์ ๊ฐ์ 1 ์ฆ๊ฐ์ํจ๋ค.
while (true) {
if (map[nx][ny] == 0) {
map[nx][ny] = -1;
A = nx;
B = ny;
moveCount++;
continue;
}
}
3๋จ๊ณ
๋ง์ฝ ๋ค ๋ฐฉํฅ ๋ชจ๋ ์ด๋ฏธ ๊ฐ๋ณธ ์นธ์ด๊ฑฐ๋ ๋ฐ๋ค๋ก ๋์ด ์๋ ์นธ์ธ ๊ฒฝ์ฐ์๋, ๋ฐ๋ผ๋ณด๋ ๋ฐฉํฅ์ ์ ์งํ ์ฑ๋ก ํ ์นธ ๋ค๋ก ๊ฐ๊ณ 1๋จ๊ณ๋ก ๋์๊ฐ๋ค. ๋จ, ์ด๋ ๋ค์ชฝ ๋ฐฉํฅ์ด ๋ฐ๋ค์ธ ์นธ์ด๋ผ ๋ค๋ก ๊ฐ ์ ์๋ ๊ฒฝ์ฐ์๋ ์์ง์์ ๋ฉ์ถ๋ค.
์บ๋ฆญํฐ์ ์ํ์ข์ฐ ๋ค ๋ฐฉํฅ ๋ชจ๋ ์ ์งํ ์ ์๋ ๊ฒฝ์ฐ, ํ ์นธ ๋ค๋ก ์ด๋ํด์ผ ํ๋ค.
- ๋ท ์นธ์ด ์ก์ง์ธ ๊ฒฝ์ฐ: 1๋จ๊ณ๋ก ๋์๊ฐ
- ๋ท ์นธ์ด ๋ฐ๋ค์ธ ๊ฒฝ์ฐ: ์์ง์์ ๋ฉ์ถ๋ค(์ข ๋ฃ)
๋จผ์ 3๋จ๊ณ๋ฅผ ๊ตฌํํ๊ธฐ ์ํด์๋ ์บ๋ฆญํฐ์ ํ์ ๊ฐ์๋ฅผ ์ฒดํฌํด์ผ ํ๋ค.
๋ฐ๋ณต๋ฌธ์ ๋๋ฉด์ turnCount์ ๊ฐ์ 1์ฉ ์ฆ๊ฐ์ํจ๋ค.
int turnCount = 0;
while (true) {
turnCount++;
turnLeft();
}
๋ช ์ฌํ ๊ฒ!!
๋ค์ ์นธ์ผ๋ก ์ ์งํ ๊ฒฝ์ฐ์๋ turnCount์ ๊ฐ์ 0์ผ๋ก ์ด๊ธฐํ์ํจ๋ค.
while (true) {
if (map[nx][ny] == 0) {
map[nx][ny] = -1;
A = nx;
B = ny;
moveCount++;
turnCount = 0;
continue;
}
}
์ด์ turnCount์ ๊ฐ์ด 4๊ฐ ๋๋ ๊ฒฝ์ฐ๋ฅผ ๊ตฌํํ๋ค.
๋ฐ๋ผ๋ณด๋ ๋ฐฉํฅ์ผ๋ก ํ ์นธ ์์ผ๋ก ๊ฐ ๋๋ "+"๋ก ํ ์นธ ๋ค๋ก ๊ฐ ๋๋ "-"๋ก ํํํ๋ค.
ํด๋น ์นธ์ด ๋ฐ๋ค์ธ ๊ฒฝ์ฐ์๋ while๋ฌธ์ ์ข ๋ฃํ๊ณ ๋ฐ๋ค๊ฐ ์๋ ๊ฒฝ์ฐ์๋ ํ์ฌ ์บ๋ฆญํฐ์ ์ขํ๋ฅผ ๋ณ๊ฒฝํ ํ turnCount์ ๊ฐ์ 0์ผ๋ก ์ด๊ธฐํํ์ฌ ๋ค์ 1๋จ๊ณ๋ก ๋์๊ฐ๋ค.
if (turnCount == 4) {
nx = A - dx[d];
ny = B - dy[d];
if (map[nx][ny] == 1) {
break;
}
A = nx;
B = ny;
turnCount = 0;
}
๊ตฌํ ์ฝ๋
public class TC_4_2 {
static int d;
// ์ผ์ชฝ ๋ฐฉํฅ์ผ๋ก ํ์
static void turnLeft() {
d -= 1;
if (d == -1) {
d = 3;
}
}
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
StringTokenizer st = new StringTokenizer(br.readLine());
int N = Integer.parseInt(st.nextToken());
int M = Integer.parseInt(st.nextToken());
st = new StringTokenizer(br.readLine());
int A = Integer.parseInt(st.nextToken());
int B = Integer.parseInt(st.nextToken());
d = Integer.parseInt(st.nextToken());
// ๋งต ๋ฐฐ์ด์ ์ ์ฅ
int[][] map = new int[N][M];
for (int i = 0; i < N; i++) {
st = new StringTokenizer(br.readLine());
for (int j = 0; j < M; j++) {
map[i][j] = Integer.parseInt(st.nextToken());
}
}
int[] dx = {-1, 0, 1, 0};
int[] dy = {0, 1, 0, -1};
int turnCount = 0;
int moveCount = 1;
// ์ฒ์ ์์๋ ๊ณณ ๋ฐฉ๋ฌธํ ์นธ์ผ๋ก ์ฒดํฌ
map[A][B] = -1;
while (true) {
turnCount++;
turnLeft();
int nx = A + dx[d];
int ny = B + dy[d];
// ์ก์ง์ด๋ฉด์ ๋ฐฉ๋ฌธํ์ง ์์ ์นธ์ธ ๊ฒฝ์ฐ
if (map[nx][ny] == 0) {
map[nx][ny] = -1;
A = nx;
B = ny;
moveCount++;
turnCount = 0;
continue;
}
// ๋ค ๋ฐฉํฅ ๋ชจ๋ ํ์ธ
if (turnCount == 4) {
nx = A - dx[d];
ny = B - dy[d];
// ํ ์นธ ๋ค๊ฐ ๋ฐ๋ค์ธ ๊ฒฝ์ฐ
if (map[nx][ny] == 1) {
break;
}
A = nx;
B = ny;
turnCount = 0;
}
}
System.out.println(moveCount);
}
}
Reference
์ด๊ฒ์ด ์ทจ์ ์ ์ํ ์ฝ๋ฉํ ์คํธ๋ค - ๋๋๋น
'๐ฏPS - Baekjoon, etc > ๊ตฌํ' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
๐ฅ[๋ฐฑ์ค, 2116] ์ฃผ์ฌ์ ์๊ธฐ (Java) (0) | 2023.04.03 |
---|---|
[์ด๊ฒ์ด ์ฝ๋ฉํ ์คํธ๋ค] ์์ค์ ๋์ดํธ (Java) (0) | 2023.03.04 |
๋๊ธ