์ผ | ์ | ํ | ์ | ๋ชฉ | ๊ธ | ํ |
---|---|---|---|---|---|---|
1 | 2 | 3 | ||||
4 | 5 | 6 | 7 | 8 | 9 | 10 |
11 | 12 | 13 | 14 | 15 | 16 | 17 |
18 | 19 | 20 | 21 | 22 | 23 | 24 |
25 | 26 | 27 | 28 | 29 | 30 | 31 |
- Dijkstra
- ์ด์งํธ๋ฆฌ
- upperbound
- ํฌํฌ์ธํฐ
- ์นด์นด์ค
- ํธ๋ผ์ด
- dp
- PriorityQueue
- ๋ถ๋ถ์งํฉ
- ์ฌ๊ท
- ์์ด
- ๋ค์ต์คํธ๋ผ
- ์ธ๊ทธ๋จผํธํธ๋ฆฌ
- ์ฐ์ ์์ํ
- ๊ทธ๋ฆฌ๋
- ์กฐํฉ
- ๋ฐฑํธ๋ํน
- ๋นํธ๋ง์คํน
- ๊ตฌํ
- Union Find
- BFS
- dfs
- Django
- ์๋ฎฌ๋ ์ด์
- LowerBound
- ์ด๋ถํ์
- ํ๋ก์ด๋์์
- ์๋ฃ๊ตฌ์กฐ
- ํ์๊ฐ์
- Floyd
- Today
- Total
J
[JAVA] BOJ ๋ฐฑ์ค 14503 ๋ก๋ด ์ฒญ์๊ธฐ ๋ณธ๋ฌธ
[JAVA] BOJ ๋ฐฑ์ค 14503 ๋ก๋ด ์ฒญ์๊ธฐ
snowball๐ฐ 2023. 1. 28. 17:40๋ฌธ์
๋ก๋ด ์ฒญ์๊ธฐ๊ฐ ์ฃผ์ด์ก์ ๋, ์ฒญ์ํ๋ ์์ญ์ ๊ฐ์๋ฅผ ๊ตฌํ๋ ํ๋ก๊ทธ๋จ์ ์์ฑํ์์ค.
๋ก๋ด ์ฒญ์๊ธฐ๊ฐ ์๋ ์ฅ์๋ N×M ํฌ๊ธฐ์ ์ง์ฌ๊ฐํ์ผ๋ก ๋ํ๋ผ ์ ์์ผ๋ฉฐ, 1×1ํฌ๊ธฐ์ ์ ์ฌ๊ฐํ ์นธ์ผ๋ก ๋๋์ด์ ธ ์๋ค. ๊ฐ๊ฐ์ ์นธ์ ๋ฒฝ ๋๋ ๋น ์นธ์ด๋ค. ์ฒญ์๊ธฐ๋ ๋ฐ๋ผ๋ณด๋ ๋ฐฉํฅ์ด ์์ผ๋ฉฐ, ์ด ๋ฐฉํฅ์ ๋, ์, ๋จ, ๋ถ์ค ํ๋์ด๋ค. ์ง๋์ ๊ฐ ์นธ์ (r, c)๋ก ๋ํ๋ผ ์ ์๊ณ , r์ ๋ถ์ชฝ์ผ๋ก๋ถํฐ ๋จ์ด์ง ์นธ์ ๊ฐ์, c๋ ์์ชฝ์ผ๋ก ๋ถํฐ ๋จ์ด์ง ์นธ์ ๊ฐ์์ด๋ค.
→ ์ด๋ฅผ ํตํด ๋ฐฐ์ด์ ์ธ๋ฑ์ค๋ฅผ 0๋ถํฐ ์์ํด์ผ ํ๋ค๋ ๊ฒ์ ์์ ์๋ค.
๋ก๋ด ์ฒญ์๊ธฐ๋ ๋ค์๊ณผ ๊ฐ์ด ์๋ํ๋ค.
- ํ์ฌ ์์น๋ฅผ ์ฒญ์ํ๋ค.
- ํ์ฌ ์์น์์ ํ์ฌ ๋ฐฉํฅ์ ๊ธฐ์ค์ผ๋ก ์ผ์ชฝ๋ฐฉํฅ๋ถํฐ ์ฐจ๋ก๋๋ก ํ์์ ์งํํ๋ค.
- ์ผ์ชฝ ๋ฐฉํฅ์ ์์ง ์ฒญ์ํ์ง ์์ ๊ณต๊ฐ์ด ์กด์ฌํ๋ค๋ฉด, ๊ทธ ๋ฐฉํฅ์ผ๋ก ํ์ ํ ๋ค์ ํ ์นธ์ ์ ์งํ๊ณ 1๋ฒ๋ถํฐ ์งํํ๋ค.
- ์ผ์ชฝ ๋ฐฉํฅ์ ์ฒญ์ํ ๊ณต๊ฐ์ด ์๋ค๋ฉด, ๊ทธ ๋ฐฉํฅ์ผ๋ก ํ์ ํ๊ณ 2๋ฒ์ผ๋ก ๋์๊ฐ๋ค.
- ๋ค ๋ฐฉํฅ ๋ชจ๋ ์ฒญ์๊ฐ ์ด๋ฏธ ๋์ด์๊ฑฐ๋ ๋ฒฝ์ธ ๊ฒฝ์ฐ์๋, ๋ฐ๋ผ๋ณด๋ ๋ฐฉํฅ์ ์ ์งํ ์ฑ๋ก ํ ์นธ ํ์ง์ ํ๊ณ 2๋ฒ์ผ๋ก ๋์๊ฐ๋ค.
- ๋ค ๋ฐฉํฅ ๋ชจ๋ ์ฒญ์๊ฐ ์ด๋ฏธ ๋์ด์๊ฑฐ๋ ๋ฒฝ์ด๋ฉด์, ๋ค์ชฝ ๋ฐฉํฅ์ด ๋ฒฝ์ด๋ผ ํ์ง๋ ํ ์ ์๋ ๊ฒฝ์ฐ์๋ ์๋์ ๋ฉ์ถ๋ค.
๋ก๋ด ์ฒญ์๊ธฐ๋ ์ด๋ฏธ ์ฒญ์๋์ด์๋ ์นธ์ ๋ ์ฒญ์ํ์ง ์์ผ๋ฉฐ, ๋ฒฝ์ ํต๊ณผํ ์ ์๋ค.
→ ์ผ์ฑ ๊ธฐ์ถ๋ฌธ์ ๋ ๋ฌธ์ ์์ ์ ์๋ ์ํฉ๋๋ก ํด์ผํ๋ค! ์์๋ก ์ํฉ์ ๋ฐ๊พธ์ด ํจ์๋ฅผ ์ํํ๋ฉด ์ค๋ฅ๊ฐ ๋ ๋ ์ด์ ๋ฅผ ์ฐพ๊ธฐ ์ด๋ ต๋ค
์ ๋ ฅ
์ฒซ์งธ ์ค์ ์ธ๋ก ํฌ๊ธฐ N๊ณผ ๊ฐ๋ก ํฌ๊ธฐ M์ด ์ฃผ์ด์ง๋ค. (3 ≤ N, M ≤ 50)
๋์งธ ์ค์ ๋ก๋ด ์ฒญ์๊ธฐ๊ฐ ์๋ ์นธ์ ์ขํ (r, c)์ ๋ฐ๋ผ๋ณด๋ ๋ฐฉํฅ d๊ฐ ์ฃผ์ด์ง๋ค. d๊ฐ 0์ธ ๊ฒฝ์ฐ์๋ ๋ถ์ชฝ์, 1์ธ ๊ฒฝ์ฐ์๋ ๋์ชฝ์, 2์ธ ๊ฒฝ์ฐ์๋ ๋จ์ชฝ์, 3์ธ ๊ฒฝ์ฐ์๋ ์์ชฝ์ ๋ฐ๋ผ๋ณด๊ณ ์๋ ๊ฒ์ด๋ค.
→ ๋ถ : 0, ๋ : 1, ๋จ: 2, ์: 3, ์ด๋ ๋ถ์ชฝ์ ์ผ์ชฝ ๋ฐฉํฅ ์ ์ง์ ๋์ชฝ์ผ๋ก ํฅํ๋ ๊ฒ์ด ์๋๋ผ ์์ชฝ์ผ๋ก ํฅํ๋ ๊ฒ์์ ์์์ผ ํ๋ค.
์ ์งธ ์ค๋ถํฐ N๊ฐ์ ์ค์ ์ฅ์์ ์ํ๊ฐ ๋ถ์ชฝ๋ถํฐ ๋จ์ชฝ ์์๋๋ก, ๊ฐ ์ค์ ์์ชฝ๋ถํฐ ๋์ชฝ ์์๋๋ก ์ฃผ์ด์ง๋ค. ๋น ์นธ์ 0, ๋ฒฝ์ 1๋ก ์ฃผ์ด์ง๋ค. ์ง๋์ ์ฒซ ํ, ๋ง์ง๋ง ํ, ์ฒซ ์ด, ๋ง์ง๋ง ์ด์ ์๋ ๋ชจ๋ ์นธ์ ๋ฒฝ์ด๋ค.
๋ก๋ด ์ฒญ์๊ธฐ๊ฐ ์๋ ์นธ์ ์ํ๋ ํญ์ ๋น ์นธ์ด๋ค.
์ฝ๋
์ ์ฒด ์ฝ๋
import java.io.*;
import java.util.*;
public class BOJ_14503 {
static int N;
static int M;
static int[][] home;
static int result;
static int rx;
static int ry;
static int rd;
static int check;
public static void main(String[] args) throws Exception {
BufferedReader bf = new BufferedReader(new InputStreamReader(System.in));
StringBuilder sb = new StringBuilder();
StringTokenizer st = new StringTokenizer(bf.readLine(), " ");
N = Integer.parseInt(st.nextToken());
M = Integer.parseInt(st.nextToken());
home = new int[N][M];
st = new StringTokenizer(bf.readLine(), " ");
rx = Integer.parseInt(st.nextToken());
ry = Integer.parseInt(st.nextToken());
rd = Integer.parseInt(st.nextToken());
for (int i = 0; i < N; i++) {
st = new StringTokenizer(bf.readLine(), " ");
for (int j = 0; j < M; j++)
home[i][j] = Integer.parseInt(st.nextToken());
}
clean();
sb.append(result);
System.out.println(sb.toString());
}
static void clean() {
int[][] visited = new int[N][M];
int[] dx = { 0, -1, 0, 1 };
int[] dy = { -1, 0, 1, 0 };
while (true) {
int nx, ny;
if (visited[rx][ry] == 0) {
visited[rx][ry] = 1;
result++;
} // 1๋ฒ์ ์ํํ์ฌ ํ์ฌ ์์น๋ฅผ ์ฒญ์ํ๋ค.
if (check == 4) {
if (rd < 1) {
nx = rx + dx[3];
ny = ry + dy[3];
} else {
nx = rx + dx[rd - 1];
ny = ry + dy[rd - 1];
}
if (nx < 0 || ny < 0 || nx >= N || ny >= M || home[nx][ny] == 1)
return;
else {
rx = nx;
ry = ny;
check = 0;
}
}
nx = rx + dx[rd];
ny = ry + dy[rd];
if (nx >= 0 && ny >= 0 && nx < N && ny < M && visited[nx][ny] != 1 && home[nx][ny] != 1) {
rx = nx;
ry = ny;
check = 0;
} else
check++;
rd--;
if (rd < 0)
rd = 3;
}
}
}
์์๋๋ก ์ฝ๋๋ฅผ ์ดํด๋ณด์!
static int N;
static int M;
static int[][] home;
static int result;
static int rx;
static int ry;
static int rd;
static int check;
๋ค์ ๋ณ์๋ค์ ์ ์ญ ๋ณ์๋ก ์ฌ์ฉํ ๋ณ์๋ค์ด๋ค.
home ๋ฐฐ์ด์ ์ฒ์ ์ ๋ ฅ๋ฐ์ ๊ตฌ์ญ์ ๋ด์ ๋ฐฐ์ด์ด๋ค.
rx, ry, rd๋ ๊ฐ๊ฐ ๋ก๋ด์ ํ์ฌ ์์น์ ๋ฐฉํฅ์ ๋ด์ ๋ณ์์ด๋ค.
check ๋ณ์๋ ๋ก๋ด์ด ํ์ฌ ์์น์์ 4 ๋ฐฉํฅ ์ค ๋ช๊ฐ์ ๋ฐฉํฅ์ ํ์ธํ๋์ง๋ฅผ ๋ด์ ๋ณ์์ด๋ค.
BufferedReader bf = new BufferedReader(new InputStreamReader(System.in));
StringBuilder sb = new StringBuilder();
StringTokenizer st = new StringTokenizer(bf.readLine(), " ");
N = Integer.parseInt(st.nextToken());
M = Integer.parseInt(st.nextToken());
home = new int[N][M];
st = new StringTokenizer(bf.readLine(), " ");
rx = Integer.parseInt(st.nextToken());
ry = Integer.parseInt(st.nextToken());
rd = Integer.parseInt(st.nextToken());
for (int i = 0; i < N; i++) {
st = new StringTokenizer(bf.readLine(), " ");
for (int j = 0; j < M; j++)
home[i][j] = Integer.parseInt(st.nextToken());
}
clean();
sb.append(result);
System.out.println(sb.toString());
BufferedReader๋ฅผ ํตํด ์ ๋ ฅ์ ๋ฐ๊ณ StringBuilder๋ก ์ถ๋ ฅํ๋ค.
์ด๋ clean ํจ์์์ ์ฒญ์๊ฐ ์ด๋ฃจ์ด์ง๊ณ ๊ฒฐ๊ณผ๊ฐ์ result ๋ณ์์ ๋ด๊ฒจ์ง๋ค.
static void clean() {
int[][] visited = new int[N][M];
int[] dx = { 0, -1, 0, 1 };
int[] dy = { -1, 0, 1, 0 };
visited ๋ฐฐ์ด์ ํ์ฌ ์์น๋ฅผ ์ฒญ์ ํ๋์ง์ ์ฌ๋ถ๋ฅผ ๋ํ๋ด๋ ๊ฐ์ ๋ด์ ๋ฐฐ์ด์ด๋ค.
dx, dy ๋ฐฐ์ด์ ๋ถ, ๋, ๋จ, ์๋ฅผ ๋ํ๋ด๋ ์ซ์๋ฅผ ์ธ๋ฑ์ค ๊ฐ์ผ๋ก ๋ฐ์์ ๋ ๊ทธ ๋ฐฉํฅ์ ์ผ์ชฝ ๋ฐฉํฅ์ผ๋ก ์ ์งํ๊ฒ ํ๋ ๋ฐฐ์ด์ด๋ค.
์ฆ, rx += dx[๋ถ], ry += dy[๋ถ]์ ํ๊ฒ ๋๋ฉด ๋ก๋ด์ ๋ถ์ชฝ์ ๋ฐ๋ผ๋ดค์ ๋์ ์ผ์ชฝ๋ฐฉํฅ์ธ ๋์ชฝ์ผ๋ก ํ์นธ ์ ์งํ๊ฒ ๋๋ค.
while (true) {
int nx, ny;
if (visited[rx][ry] == 0) {
visited[rx][ry] = 1;
result++;
}
while ๋ฌธ์ ํตํด 2-4์ ํด๋นํ๋ ๊ฒฝ์ฐ loop๋ฅผ ๋น ์ ธ๋์ค๊ฒ ํ๊ธฐ ์ํด true๋ฅผ ์จ์ฃผ์๋ค.
nx, ny ๋ณ์๋ ํ์ธํ ์์น๋ฅผ ๋ด์ ๋ณ์์ด๋ค.
๋ค์์ if๋ฌธ์ 1๋ฒ์ ์ํํ๊ณ ์๋ค. ํด๋น ์์น๊ฐ ์ฒญ์๊ฐ ๋์ง ์์๋ค๋ฉด ์ฒญ์๋ฅผ ํด์ฃผ๊ณ ๊ฒฐ๊ณผ๊ฐ์ 1 ์ฆ๊ฐ์ํจ๋ค.
if (check == 4) {
if (rd < 1) {
nx = rx + dx[3];
ny = ry + dy[3];
} else {
nx = rx + dx[rd - 1];
ny = ry + dy[rd - 1];
}
if (nx < 0 || ny < 0 || nx >= N || ny >= M || home[nx][ny] == 1)
return;
else {
rx = nx;
ry = ny;
check = 0;
}
}
๋ค์ if๋ฌธ์ 2-3,4๋ฅผ ์ํํ๋ค.
check๊ฐ 4์ด๋ฏ๋ก ํ์ฌ ์์น์์ ๋ค ๋ฐฉํฅ์ ๋ชจ๋ ํ์ํ์๊ณ ๋ค ๋ฐฉํฅ ๋ชจ๋ ์ฒญ์๊ฐ ์ด๋ฏธ ๋์๊ฑฐ๋ ๋ฒฝ์ธ ๊ฒฝ์ฐ์ด๋ค. ์ด๋ ๋ฐ๋ผ๋ณด๋ ๋ฐฉํฅ์ ์ ์งํ ์ฑ(rd๋ฅผ ๋ณ๊ฒฝํ์ง ์์ ์ฑ) ํ ์นธ ํ์ง์ ํด์ผํ๋ค.
rd๋ฅผ -2, +2๋ฅผ ํ์ง ์๊ณ -1์ ํ๋ ์ด์ ๋ ํ์ฌ ์ธ๋ฑ์ค๋ฅผ ๋ฃ์์ ๋ ์ผ์ชฝ ๋ฐฉํฅ์ผ๋ก ์ ์งํ๊ฒ ๋์ด์์ผ๋ฏ๋ก -1์ ํด์ฃผ์ด์ผ ํ๋ค.
nx, ny๊ฐ ์นธ์ ๋ฒ์ด๋ฌ๊ฑฐ๋ ๋ฒฝ์ธ ๊ฒฝ์ฐ์๋ ์๋์ ๋ฉ์ถ๋ค. → return
๊ทธ๋ ์ง ์๋ค๋ฉด ํ์ง์ ํ๊ณ ์๋ก์ด ์์น๋ก ์ด๋ํ์ผ๋ฏ๋ก check๋ฅผ ๊ฐฑ์ ํ๋ค. → ๋ก๋ด์ ์์น๋ฅผ ๋ณ๊ฒฝํ๋ค
nx = rx + dx[rd];
ny = ry + dy[rd];
if (nx >= 0 && ny >= 0 && nx < N && ny < M && visited[nx][ny] != 1 && home[nx][ny] != 1) {
rx = nx;
ry = ny;
check = 0;
} else
check++;
rd--;
if (rd < 0)
rd = 3;
๋ค์์ 2-1,2๋ฅผ ์ํํ๋ค.
nx, ny๋ฅผ ํ์ฌ ๋ฐฉํฅ์ ์ผ์ชฝ ๋ฐฉํฅ์ผ๋ก ํ์นธ ์ ์งํ ์์น๋ก ์ง์ ํ๋ค.
์ด๋ ์ด ์ด๋ํ ์์น๊ฐ ์นธ์์ ๋ฒ์ด๋์ง ์๊ณ ์ฒญ์ํ์ง ์์๊ณ ๋ฒฝ๋ ์๋๋ผ๋ฉด ์ด๋ํ๋ค. ๋ํ ์๋ก์ด ์์น์ ๋๋ฌํ์ผ๋ฏ๋ก check๋ฅผ ๊ฐฑ์ ํ๋ค. → rx, ry๋ฅผ ์์ ํ๋ค.
์ฒญ์๊ฐ ๋์ด์๊ฑฐ๋ ๋ฒฝ์ธ ๊ฒฝ์ฐ → check๋ฅผ 1 ์ฆ๊ฐ์ํจ๋ค.
๋ ๊ฒฝ์ฐ ๋ชจ๋ ์ผ์ชฝ์ผ๋ก ํ์ ํด์ผ ํ๋ฏ๋ก rd๋ฅผ ํ๋ ๊ฐ์์ํจ๋ค.
์ด๋ rd๊ฐ 0๋ณด๋ค ์์ ๊ฒฝ์ฐ(-1) ์ธ๋ฑ์ค ๋ฒ์๋ฅผ ๋ฒ์ด๋๊ฒ ๋๋ฏ๋ก 3์ผ๋ก ๊ฐ์ ๋ฐ๊พธ์ด ์ค๋ค.
'๐ Problem Solving > ๐ป Samsung SW Expert' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[JAVA] BOJ ๋ฐฑ์ค 15686 ์นํจ ๊ฑฐ๋ฆฌ (0) | 2023.01.29 |
---|---|
[JAVA] BOJ ๋ฐฑ์ค 15683 ๊ฐ์ (0) | 2023.01.29 |
[JAVA] BOJ ๋ฐฑ์ค 14891 ํฑ๋๋ฐํด (1) | 2023.01.29 |
[JAVA] BOJ ๋ฐฑ์ค 14889 ์คํํธ์ ๋งํฌ (0) | 2023.01.29 |
[JAVA] BOJ ๋ฐฑ์ค 14502๋ฒ ์ฐ๊ตฌ์ (1) | 2023.01.27 |