โจ ๊ตฌํ
https://www.acmicpc.net/problem/14503
14503๋ฒ: ๋ก๋ด ์ฒญ์๊ธฐ
์ฒซ์งธ ์ค์ ๋ฐฉ์ ํฌ๊ธฐ $N$๊ณผ $M$์ด ์ ๋ ฅ๋๋ค. $(3 \le N, M \le 50)$โ ๋์งธ ์ค์ ์ฒ์์ ๋ก๋ด ์ฒญ์๊ธฐ๊ฐ ์๋ ์นธ์ ์ขํ $(r, c)$์ ์ฒ์์ ๋ก๋ด ์ฒญ์๊ธฐ๊ฐ ๋ฐ๋ผ๋ณด๋ ๋ฐฉํฅ $d$๊ฐ ์ ๋ ฅ๋๋ค. $d$๊ฐ $0$์ธ ๊ฒฝ์ฐ ๋ถ์ชฝ
www.acmicpc.net
๐ ๊ณ ๋ คํด์ผํ ์
- ์ฃผ๋ณ ๋์๋จ๋ถ 4์นธ ์ค ์ฒญ์๋์ง ์์ ๋น ์นธ์ด ์๋ ๊ฒฝ์ฐ ์ฆ, ๋ชจ๋ ์ฒญ์๋์๋ค๋ฉด ๋ฐ๋ผ๋ณด๋ ๋ฐฉํฅ์ ์ ์งํ๊ณ ํ ์นธ ํ์ง ๊ฐ๋ฅํ๋ฉด ํ์งํ๋ค.
- ๋ฌธ์ ์์ 0123 = ๋ถ๋๋จ์๋ผ๋ ์กฐ๊ฑด์ ์ ์ํ๋ค.
- ํ์งํ ์ ๋ฐฉํฅ์ด ๋ถโ๋จ, ๋จโ๋ถ / ๋โ์, ์โ๋์ผ๋ก ์ด๋ํ๊ธฐ ๋๋ฌธ์ ํ์ฌ ๋ฐ๋ผ๋ณด๋ ๋ฐฉํฅ์ด 0, 1(๋ถ, ๋)์ด๋ผ๋ฉด +2๋ฅผ ํด์ค์ผ๋ก์จ 2, 4(๋จ, ์)๋ก ํํํ๋ค.
- ๋ฐ๋๋ก ํ์ฌ ๋ฐ๋ผ๋ณด๋ ๋ฐฉํฅ์ด 2, 4(๋จ, ์)๋ผ๋ฉด -2๋ฅผ ํด์ค์ผ๋ก์จ 0, 1(๋ถ, ๋)๋ก ํํํ๋ค. ๐ ์ด๋๋ฐฉํฅ๋ง ๋ฐ๋๋ ๊ฒ์ผ ๋ฟ ๋ฐ๋ผ๋ณด๋ ๋ฐฉํฅ์ ๊ทธ๋๋ก๋ค.
- ๋ค์ชฝ ์นธ์ด ๋ฒฝ์ด๋ผ ํ์ง ๋ถ๊ฐํ๋ค๋ฉด ํ๋ก๊ทธ๋จ์ ๋์ด ๋๋ค.
- ์ฒญ์๋ ์นธ์ 2๋ก ํํํ๋ค.
- ์ฒญ์๋ฅผ ํด์ผํ ๊ณณ, ์๋์ ๋ฉ์ถฐ์ผํ ๋๋ฅผ flag ํ์๋ฅผ ํตํด ํ๋จํ๋ค.
๐น๏ธ ํ์ด๋ฐฉ๋ฒ
์์ ์ ๋ชป ํ์๋ ๊ฑด๋ฐ ์ฝ๋ํธ๋ฆฌ๋ฅผ ๊ณ์ ํ์ด์ ๊ทธ๋ฐ์ง ์ฝ๊ฒ ๋๊ปด์ก๊ณ ํธ๋๋ฐ ์ผ๋ง ์ ๊ฑธ๋ ธ๋ค.
ํน๋ณํ ์๊ณ ๋ฆฌ์ฆ์ ํ์ํ์ง ์๊ณ ๊ณ ๋ คํด์ผํ ์ ์ ์ ์ํ๋ฉฐ ๊ทธ๋ฅ ๊ตฌํํด์ ํ๋ฉด๋๋ค.
๐ฉ๐ป ์ ์ฒด ์ฝ๋
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.util.StringTokenizer;
public class BOJ_14503_๋ก๋ด์ฒญ์๊ธฐ {
static int N, M;
static int[] dx = {-1, 0, 1, 0}; // ๋ถ๋๋จ์
static int[] dy = {0, 1, 0, -1};
static int[][] room;
static boolean stop;
static boolean shouldClean;
static int result;
static int rx, ry, rd; // ๋ก๋ด์ฒญ์๊ธฐ์ ์์น์ ๋ฐฉํฅ
static void simulate() {
while(true) {
if(room[rx][ry]==0) clean(rx, ry);
if(isCleaned(rx, ry)) {
allCleaned();
if(stop) break;
clean(rx, ry);
}else {
notAllCleaned();
clean(rx, ry);
}
}
}
// ํ์ฌ ์นธ์ ์ฃผ๋ณ 4์นธ์ด ๋ชจ๋ ์ฒญ์๋์๋์ง ์๋์ง ํ์ธ
static boolean isCleaned(int x, int y) {
boolean flag = true;
for(int i=0; i<4; i++) {
int nx = x+dx[i];
int ny = y+dy[i];
if(inRange(nx, ny)) {
// ์ฒญ์๋์ง ์์ ๊ณณ์ด ์๋ค๋ฉด
if(room[nx][ny]==0) {
flag=false;
break;
}
}
}
return flag;
}
// ํ์ฌ ์นธ์ด ์ฒญ์๋์ง ์์ ๊ฒฝ์ฐ ์ฒญ์ํ๊ธฐ
static void clean(int x, int y) {
if(room[x][y]==0) {
result++;
room[x][y]=2;
}
}
// ํ์ฌ ์นธ์ ์ฃผ๋ณ 4์นธ ์ค ์ฒญ์๋์ง ์์ ๋น์นธ์ด ์๋ ๊ฒฝ์ฐ = ์ฒญ์ ๋ชจ๋ ์๋ฃ
static void allCleaned() {
int nx=0, ny=0;
// ๋ฐ๋ผ๋ณด๋ ๋ฐฉํฅ์ ์ ์งํ์ฑ๋ก ํ์ง ๊ฐ๋ฅํ์ง ํ์ธ
if(rd==0 || rd==1) {
nx = rx+dx[rd+2];
ny = ry+dy[rd+2];
}else {
nx = rx+dx[rd-2];
ny = ry +dy[rd-2];
}
if(inRange(nx, ny) && room[nx][ny]!=1) {
rx=nx;
ry=ny;
return;
}else if(inRange(nx, ny) && room[nx][ny]==1) stop=true;
}
// ํ์ฌ ์นธ์ ์ฃผ๋ณ 4์นธ ์ค ์ฒญ์๋์ง ์์ ๋น์นธ์ด ์๋ ๊ฒฝ์ฐ
static void notAllCleaned() {
// ๋ฐ์๊ณ ๋ฐฉํฅ์ผ๋ก 90๋ ํ์
rd = (rd+3)%4;
// ๋ฐ๋ผ๋ณด๋ ๋ฐฉํฅ์ ๊ธฐ์ค์ผ๋ก ์์ชฝ ์นธ์ด ์ฒญ์๋์ง ์์ ๋น์นธ์ธ ๊ฒฝ์ฐ ํ ์นธ ์ ์ง
int nx = rx+dx[rd];
int ny = ry+dy[rd];
if(inRange(nx, ny)) {
if(room[nx][ny]==0) {
rx=nx;
ry=ny;
}
}
}
static boolean inRange(int x, int y) {
if(x>=0 && y>=0 && x<N && y<M) return true;
else return false;
}
public static void main(String[] args) throws Exception{
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));
StringTokenizer st = new StringTokenizer(br.readLine());
N = Integer.parseInt(st.nextToken());
M = Integer.parseInt(st.nextToken());
room = new int[N][M];
st = new StringTokenizer(br.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(br.readLine());
for(int j=0; j<M; j++) {
room[i][j] = Integer.parseInt(st.nextToken());
}
}
simulate();
System.out.println(result);
}
}
'์๊ณ ๋ฆฌ์ฆ > BOJ' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[BOJ] 1238 ํํฐ - Java (0) | 2024.04.18 |
---|---|
[BOJ] 2169 ๋ก๋ด ์กฐ์ข ํ๊ธฐ - Java (1) | 2024.04.16 |
[BOJ] 19238 ์คํํธ ํ์ - Java (0) | 2024.04.11 |
[BOJ] 17837 ์๋ก์ด ๊ฒ์2 - Java (0) | 2024.03.19 |
[BOJ] 17485 ์ง์ฐ์ ๋ฌ ์ฌํ (Large) - Java (0) | 2024.03.12 |