https://swexpertacademy.com/main/code/problem/problemDetail.do?contestProbId=AV4yLUiKDUoDFAUx
SW Expert Academy
SW ํ๋ก๊ทธ๋๋ฐ ์ญ๋ ๊ฐํ์ ๋์์ด ๋๋ ๋ค์ํ ํ์ต ์ปจํ ์ธ ๋ฅผ ํ์ธํ์ธ์!
swexpertacademy.com
1. ๋ฌธ์ ์์ฝ
์ํ๋ช ๋ น๋๋ก ์ด๋ํ๋ค, ์ ์งํ ์ ์์ผ๋ฉด YES, ์ ์งํ ์ ์๋ค๋ฉด NO๋ฅผ ์ถ๋ ฅํ๋ค.
2. ํ์ด
22.11.13 - BFS ํ์ด
BFS ๋ก ํ์๋ค.
์ฒ์์ DFS๋ก ํ๋ค๊ฐ ํฐ์ ธ์ ์ ๊ณ BFS๋ก ๋ฐ๊ฟ์ ํ์๋๋ ์๊พธ ํ ์ผ 65/69๋ง ๋ด๋ค
(์น๊ตฌ๋ DFS๋ก ํ์๋ค. ์ค๋ ์บ ํผ์ค ๊ฐ์ DFS๋ก ํ์ด๋ณผ ๊ฒ์ด๋ค. ํ์ด ์ฌ๋ฆฌ๊ฒ ์)
ํ ์ผ 4๊ฐ๊ฐ ํต๊ณผ ๋ชปํ ์ด์ ๋ ? ๋ ์ ๋๋ฌธ์ด๋ค
4๋ฐฉํฅ์ ๊ฒฝ์ฐ๋ฅผ ๋ด์ผํ๊ธฐ ๋๋ฌธ์ ํ ๋ฐฉํฅ ๋ดค๋ค๊ฐ ์๋ณต์ ์์ผ์ค์ผ ํ๋ค.
1. ๋ฉ๋ชจ๋ฆฌ ํฌ๊ธฐ๋ฅผ ์๋ณต์์ผ์ฃผ์ง ์์๋ค.
=> ์๋ณต์ํค๋๋ฐ ๊น๋ค๋ก์ฐ๋๊น ๊ทธ๋ฅ ํด๋์ค์ ์ถ๊ฐํด์ ๋ค๊ณ ๋ค๋๊ฒ ํ๋ค.
2. ๋ฐฉ๋ฌธํ ๋ y์ขํ, x์ขํ, ๋ฐฉํฅ ๊ทธ๋ฆฌ๊ณ ๋ฉ๋ชจ๋ฆฌํฌ๊ธฐ์ ๋ฐ๋ผ ๋ฐฉ๋ฌธ ์ง์ ์ด ๋ฌ๋ผ์ง๋ค.
=> ๋ฉ๋ชจ๋ฆฌ ํฌ๊ธฐ์ ๋ฐ๋ผ ๋ฐฉํฅ์ด ๋ฐ๋ ์ ์๊ธฐ ๋๋ฌธ์ด๋ค. ๊ทธ๋์ visited๋ฅผ 4์ฐจ์์ผ๋ก ํด์ค์ผ ํ๋ค. visited[y][x][d][mem]
3. ๋ฐฉ๋ฌธํ ์ง์ ์ ๋ ๋ฐฉ๋ฌธํ์ ๋ ๋ฐ๋ก return ํด์ฃผ๋ฉด ์๋๋ค.
=> 4๋ฐฉํฅ์ ๋ด์ผํ๊ธฐ ๋๋ฌธ์ continueํด์ ๋ค์ ๋ฐฉํฅ์ผ๋ก ๋์ด๊ฐ์ผ ํ๋ค.
๋๋ ํ ๋ฐฉํฅ๋ง ๋ณด๊ณ returnํด์คฌ๊ธฐ ๋๋ฌธ์ ๋น์ฐํ ํ๋ฆฐ ๋ต์ด์๋ค.
22.11.15 - DFS ํ์ด
DFS(๋ฐฑํธ๋ํน) ์ผ๋ก ํ์๋ค.
๊ธฐ์ ์กฐ๊ฑด์
1) @์ผ ๋ (=> ์ํ true๋ก ๋ฐ๊ฟ์ฃผ๊ณ ๋ฆฌํด, ๋ตYES)
2) visited[y][x][๋ฐฉํฅ][๋ฉ๋ชจ๋ฆฌ๊ฐ] ์ ์ฌ๋ฐฉ๋ฌธํ ๋ (=> ๊ทธ๋ฅ ๋ฆฌํด => ๊ฒฐ๊ตญ ์ํ false, ๋ตNO)
๋ด๊ฐ ๋์น ๋ถ๋ถ์
1. visited๋ฅผ 4์ฐจ์์ผ๋ก ํด์ผํ๋ค.
=> visited[y][x][๋ฐฉํฅ][๋ฉ๋ชจ๋ฆฌ๊ฐ]
2. ?๋ฅผ ๋ง๋ฌ์ ๋ 4๋ฐฉ์ ๋ณด๊ธฐ ์ํด dfs๊ฐ ๋๋๋ฉด visited ํ์ฌ์ํ๋ฅผ false๋ก ๋ฐ๊ฟ์ค์ผ ํ๋ค.
3. ์ ๋ ฅ ๊ฐ์ @๊ฐ ์์ ๊ฒฝ์ฐ, ๋ฉ์ถ์ง ๋ชปํ๋ค.
=> ๋ฐ๋ก NO ์ถ๋ ฅํ๊ณ ๋ฆฌํดํด์ค์ผ ํ๋ค.
DFS, BFS ์คํ ์๊ฐ์ ํฐ ์ฐจ์ด๊ฐ ์๋ค.
3. ์ฝ๋
BFS
package a22_11_13;
import java.io.*;
import java.util.*;
public class SW_1824_ํ์ง์ด์ํ๋ก๊ทธ๋จ๊ฒ์ฆ {
static char[][] map;
static int R,C;
static boolean isStop;
static boolean[][][][] visited;
static int[] dy = {-1,1,0,0};
static int[] dx = {0,0,-1,1};
public static void main(String[] args) throws Exception {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
StringTokenizer st = null;
int T = Integer.parseInt(br.readLine());
for (int tc=1; tc<=T; tc++) {
st = new StringTokenizer(br.readLine());
R = Integer.parseInt(st.nextToken());
C = Integer.parseInt(st.nextToken());
map = new char[R][C];
visited = new boolean[R][C][4][16];
for (int i=0; i<R; i++) {
String s = br.readLine();
for (int j=0; j<C; j++) {
map[i][j] = s.charAt(j);
}
} //์
๋ ฅ ๋
isStop=false;
bfs();
if (isStop==false) System.out.println("#"+tc+" "+"NO");
else System.out.println("#"+tc+" "+"YES");
}
}
static void bfs() {
Queue<Pos> queue = new ArrayDeque<> ();
if (map[0][0] >= '0' && map[0][0] <= '9') {
queue.offer(new Pos(0,0,3,map[0][0]-'0'));
}
else queue.offer(new Pos(0,0,3,0));
while (!queue.isEmpty()) {
Pos cur = queue.poll();
int y = cur.y;
int x = cur.x;
int d = cur.d;
int mem = cur.mem;
if (map[y][x]=='@') {
isStop = true;
return;
}
if (map[y][x] >= '0' && map[y][x] <= '9') {
mem = map[y][x]-'0';
}
if (visited[y][x][d][mem] == true) continue; //return์ผ๋ก ๋ค๋ฅธ ๋ฐฉํฅ์ ๋ชป๋ณด๊ณ ๋ฐ๋ก๋๋ด๋ฒ๋ ค์ ํ๋ฆผ
visited[y][x][d][mem] = true;
if (map[y][x]=='?') {
for (int rand=0; rand<4; rand++) {
int ny = y+dy[rand];
int nx = x+dx[rand];
if (ny<0) ny=R-1;
else if (ny>=R) ny=0;
else if (nx<0) nx=C-1;
else if (nx>=C) nx=0;
queue.offer(new Pos(ny, nx, rand, mem));
}
}
else {
if (map[y][x]=='^') d=0;
else if (map[y][x]=='v') d=1;
else if (map[y][x]=='<') d=2;
else if (map[y][x]=='>') d=3;
else if (map[y][x]=='_') {
if (mem==0) d=3;
else d=2;
}
else if (map[y][x]=='|') {
if (mem==0) d=1;
else d=0;
}
else if (map[y][x]=='@') {
isStop = true;
return;
}
else if (map[y][x]=='+') {
if (mem==15) mem=0;
else mem++;
}
else if (map[y][x]=='-') {
if (mem==0) mem=15;
else mem--;
}
int ny = y+dy[d];
int nx = x+dx[d];
if (ny<0) ny=R-1;
else if (ny>=R) ny=0;
else if (nx<0) nx=C-1;
else if (nx>=C) nx=0;
queue.offer(new Pos(ny, nx, d, mem));
}
}
}
static class Pos {
int y, x, d, mem; //?๋ฐฉํฅ๋ง๋ค mem๊ฐ์ด ๋ฐ๋ ์ ์์ผ๋ฏ๋ก ์ ์ญ์ผ๋ก ํ๋ฉด ์๋๊ณ ๋ค๊ณ ๋ค๋
์ผ ํจ
Pos(int y, int x, int d, int mem) {
this.y = y;
this.x = x;
this.d = d;
this.mem = mem;
}
}
}
DFS
import java.io.*;
import java.util.*;
public class SW_1824_ํ์ง์ด์ํ๋ก๊ทธ๋จ๊ฒ์ฆ {
static int R,C;
static char[][] map;
static boolean isStop;
static boolean[][][][] visited;
static int[] dy = {-1,1,0,0};
static int[] dx = {0,0,-1,1};
public static void main(String[] args) throws Exception {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
StringTokenizer st = null;
int T = Integer.parseInt(br.readLine());
for (int tc=1; tc<=T; tc++) {
st = new StringTokenizer(br.readLine());
R = Integer.parseInt(st.nextToken());
C = Integer.parseInt(st.nextToken());
map = new char[R][C];
visited = new boolean[R][C][4][16];
boolean isOk = false;
for (int i=0; i<R; i++) {
String s = br.readLine();
for (int j=0; j<C; j++) {
map[i][j] = s.charAt(j);
if (map[i][j] == '@') isOk = true;
}
} //์
๋ ฅ ๋
if (isOk == false) {
System.out.println("#"+tc+" NO");
continue;
}
isStop = false;
System.out.print("#"+tc+" ");
if (map[0][0]>='0' && map[0][0]<='9') {
dfs(0,0,3, map[0][0]-'0');
}
else {
dfs(0,0,3,0);
}
if (isStop) System.out.println("YES");
else System.out.println("NO");
}
}
static void dfs(int y, int x, int d, int mem) {
if (map[y][x] == '@') {
isStop = true;
if (isStop) return;
}
if (visited[y][x][d][mem] == true) return;
visited[y][x][d][mem] = true;
if (map[y][x] == '?') {
for (int rand=0; rand<4; rand++) {
int ny = y+dy[rand];
int nx = x+dx[rand];
if (ny<0) ny = R-1;
else if (ny>=R) ny=0;
else if (nx<0) nx=C-1;
else if (nx>=C) nx=0;
if (visited[ny][nx][rand][mem] == true) continue;
dfs(ny, nx, rand, mem);
visited[y][x][d][mem] = false;
if (isStop) return;
}
} else {
if (map[y][x] == '^') d=0;
else if (map[y][x] == 'v') d=1;
else if (map[y][x] == '<') d=2;
else if (map[y][x] == '>') d=3;
else if (map[y][x] == '_') {
if (mem == 0) d=3;
else d=2;
}
else if (map[y][x] == '|') {
if (mem == 0) d=1;
else d=0;
}
else if (map[y][x]>='0' && map[y][x]<='9') {
mem = map[y][x]-'0';
}
else if (map[y][x] == '+') {
if (mem==15) mem=0;
else mem++;
}
else if (map[y][x] == '-') {
if (mem==0) mem=15;
else mem--;
}
int ny = y+dy[d];
int nx = x+dx[d];
if (ny<0) ny = R-1;
else if (ny>=R) ny=0;
else if (nx<0) nx=C-1;
else if (nx>=C) nx=0;
dfs(ny, nx, d, mem);
if (isStop) return;
}
}
}
4. ์ฌ๋ด
๊ฑฐ์ 4์๊ฐ์ ์ด ๊ฒ ๊ฐ์๋ฐ ๊ฒฐ๊ตญ ์น๊ตฌ์ ๋์์ ๋ฐ์๋ค
ํ๋ฆฐ ์ด์ ๋ฅผ ๋ฐ๊ฒฌํ๋ ๊ฒ๋ ํ์ฐธ ๊ฑธ๋ฆฌ๊ณ ํ ์คํธ์ผ์ด์ค๋ฅผ ๋ถ์ํ๋ ํ์ด ์ ๋ง ์ ๋ง ๋ถ์กฑํ ๊ฒ ๊ฐ๋ค
๋๋ ์๊ณ ๋ฆฌ์ฆ ์ํ๊ณ ์ถ๋ค..
์๊ณ ์ผ์ด๋์ DFS๋ก ๋ค์ํ์ด๋ณด์
์ดํ์ด ์ง๋์ DFS๋ก ํ์ด๋ณด์๋ค.
๋ฌธ์ ํ์ด๋ฅผ ๊น๋จน์๋ค๊ฐ ๋ค์ ํ์ด๋ณด๋๊น ํ๋ฆฐ๋ค. ์ด ๋ฌธ์ ์ฒ์๋ดค์ ๋ DFS๋ก ์ ๊ทผํ๋ค๊ฐ ์๊ฐ์ด๊ณผ๋ก ํฐ์ง๊ธธ๋ BFS๋ก ๋ฐ๊ฟจ์๋ค. ๊ทธ๋์ DFS ํ์ด์ ๋ํ ์์ฌ์์ด ์์๋๋ฐ ๊ฒฐ๊ตญ ํ์ด์ ์์ด ์์ํ๋ค. ์ด๋ฒ์ ๋ฐฉํฅ์ ํ์ ์ํ ๋ง๊ณ BFS๋ก ํ์ด๋ณด์..
'Algorithm > SWEA' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[SWEA] 2819. ๊ฒฉ์ํ์ ์ซ์ ์ด์ด ๋ถ์ด๊ธฐ (1) | 2022.11.20 |
---|---|
[SWEA] 8382. ๋ฐฉํฅ ์ ํ - Java (0) | 2022.11.14 |
[SWEA] 1486. ์ฅํ์ด์ ๋์ ์ ๋ฐ - Java (0) | 2022.11.13 |
[SWEA] 1868. ํํํํ ์ง๋ขฐ์ฐพ๊ธฐ - Java (0) | 2022.11.13 |
[SWEA] 1949. [๋ชจ์ SW ์ญ๋ํ ์คํธ] ๋ฑ์ฐ๋ก ์กฐ์ฑ - Java (1) | 2022.11.09 |