https://www.acmicpc.net/problem/20165
๋ฌธ์ ์ค๋ช
2๋ช
์ด ๊ณต๊ฒฉ๊ณผ ์๋น๋ฅผ ํ๋ ๊ฒ์
๊ณต๊ฒฉ์๋ ๋๋ฏธ๋
ธ๋ฅผ ๊ณ์ ๋์ด๋จ๋ฆฌ๊ณ , ์๋น์๋ ๋๋ฏธ๋
ธ๋ฅผ ๊ณ์ ์ธ์ด๋ค.
๊ฒ์ ์งํ
- Nํ M์ด์ 2์ฐจ์ ๊ฒฉ์ ๋ชจ์์ ๊ฒ์ํ์ ๊ฐ ๊ฒฉ์์ ๋๋ฏธ๋ ธ๋ฅผ ์ธ์. (1 <= ๋๋ฏธ๋ ธ ๋์ด <= 5)
- ๋งค ๋ผ์ด๋๋ ๊ณต๊ฒฉ์๊ฐ ๋จผ์ ๊ณต๊ฒฉ, ๊ทธ ํ ์๋น์๊ฐ ์๋น๋ฅผ ํจ
- ๊ณต๊ฒฉ์๋ ํน์ ๋๋ฏธ๋
ธ๋ฅผ ๋, ์, ๋จ, ๋ถ ์ค ์ํ๋ ๋ฐฉํฅ์ผ๋ก ๋์ด๋จ๋ฆผ
3-1. ๊ธธ์ด K์ธ ๋๋ฏธ๋ ธ๊ฐ ํน์ ๋ฐฉํฅ์ผ๋ก ๋์ด๊ฐ๋ค๋ฉด
3-2. ๊ทธ ๋ฐฉํฅ์ K-1๊ฐ์ ๋๋ฏธ๋ ธ๋ค ์ค ๋์ด์ง์ง ์์ ๊ฒ๋ค์ ๊ฐ์ ๋ฐฉํฅ์ผ๋ก ๋์ด์ง
3-3. ์ฐ์์ ์ผ๋ก ๋๋ฏธ๋ ธ๊ฐ ๋์ด์ง ์ ์์ - ์๋น์๋ ๋์ด์ ธ์๋ ๋๋ฏธ๋ ธ ์ค ํ๋๋ฅผ ์ธ์ธ ์ ์์
- ์ด R๋ฒ์ ๋ผ์ด๋๋์ ์ด ๊ณผ์ ์ด ๋ฐ๋ณต๋จ
5-1. ๋งค ๋ผ์ด๋์์ ๋์ด๋จ๋ฆฐ ๋๋ฏธ๋ ธ์ ๊ฐ์๊ฐ ๊ณต๊ฒฉ์์ ์ ์๊ฐ ๋จ
๋ฌธ์ ํ์ด
boolean[][] isFallen
: ๊ฐ ๋๋ฏธ๋
ธ๊ฐ ๋์ด์ ธ์๋์ง ์ฌ๋ถ์ ๋ํ ์ ๋ณด ๋ฐฐ์ด
์ด R๋ฒ ๋์ ๊ฒ์ ์งํwhile(R-- > 0)
1. ๊ณต๊ฒฉ ๐ attack(x,y,dir)
while(๋๋ฏธ๋
ธ ๊ธธ์ด ๋งํผ ์งํ)
๋์ด์ง์ง ์์๋ค๋ฉด, ๋์ด๋จ๋ฆฌ๊ณ ans += 1;
์ด์ ์ ๋๋ฏธ๋
ธ ๋์ด์ ํ์ฌ ๋๋ฏธ๋
ธ ๋์ด ์ค ๋ ํฐ ๊ฐ์ผ๋ก ๋ณ๊ฒฝ
๊ทธ ํ , -= 1;
์ด๋ฏธ ๋์ด์ ธ ์๋ค๋ฉด, -= 1; ๋ง ํด์ค๋ค!!
๋ฒ์๊ฐ ๋ฒ์ด๋๊ฑฐ๋, ๋์ด์ง ๋๋ฏธ๋
ธ์ ๊ธธ์ด๊ฐ ๋ ์ด์ ๋ฟ์ง ์์ ๋๊น์ง, dir ๋ฐฉํฅ์ผ๋ก ์งํ
2. ์๋น ๐ depense(x,y)
isFallen[x][y] = false
๋ก ๋ณ๊ฒฝ !!
3. ์ถ๋ ฅ
์ด ๋์ด๋จ๋ฆฐ ๊ฐ์ (ans)
์ถ๋ ฅ ํ,
๋๋ฏธ๋
ธ๊ฐ ๋์ด์ ธ ์๋ค๋ฉด → F,
๋์ด์ง์ง ์์๋ค๋ฉด → S ๋ฅผ ์ถ๋ ฅ
์ฝ๋
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.StringTokenizer;
public class Main_BOJ_20165_์ธ๋ด์_๋๋ฏธ๋
ธ_์ฅ์ธ_ํ์ {
static int N, M, R, ans = 0;
static int[][] map;
static boolean[][] isFallen;
static int[] dx = {-1, 0, 0, 1};
static int[] dy = {0, -1, 1, 0};
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
StringTokenizer stringTokenizer = new StringTokenizer(br.readLine());
N = Integer.parseInt(stringTokenizer.nextToken());
M = Integer.parseInt(stringTokenizer.nextToken());
R = Integer.parseInt(stringTokenizer.nextToken());
map = new int[N][M];
isFallen = new boolean[N][M];
for (int i = 0; i < N; i++) {
stringTokenizer = new StringTokenizer(br.readLine());
for (int j = 0; j < M; j++) {
map[i][j] = Integer.parseInt(stringTokenizer.nextToken());
}
}
while (R-- > 0) {
stringTokenizer = new StringTokenizer(br.readLine());
int x = Integer.parseInt(stringTokenizer.nextToken()) - 1;
int y = Integer.parseInt(stringTokenizer.nextToken()) - 1;
int dir = 0;
switch (stringTokenizer.nextToken()) {
case "E":
dir = 2;
break;
case "W":
dir = 1;
break;
case "S":
dir = 3;
break;
case "N":
dir = 0;
break;
}
if(!isFallen[x][y]) attack(x, y, dir);
stringTokenizer = new StringTokenizer(br.readLine());
x = Integer.parseInt(stringTokenizer.nextToken()) - 1;
y = Integer.parseInt(stringTokenizer.nextToken()) - 1;
depense(x, y);
}
System.out.println(ans);
for (boolean[] is : isFallen) {
for (boolean i : is) {
if(i) System.out.print("F ");
else System.out.print("S ");
}
System.out.println();
}
}
private static void depense(int x, int y) {
if(isFallen[x][y]) isFallen[x][y] = false;
}
private static void attack(int x, int y, int dir) {
int height = map[x][y];
int nx = x;
int ny = y;
while (height > 0) {
if (!isFallen[nx][ny]) {
height = height < map[nx][ny] ? map[nx][ny] : height;
height -= 1;
isFallen[nx][ny] = true;
ans += 1;
} else height -= 1;
nx += dx[dir];
ny += dy[dir];
if(nx < 0 || ny < 0 || N <= nx || M <= ny) break;
}
}
}
'์๊ณ ๋ฆฌ์ฆ > ๋ฐฑ์ค' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[ BOJ / ๋ฐฑ์ค 17837 ] ์๋ก์ด ๊ฒ์ 2 (0) | 2022.02.22 |
---|---|
[ ๋ฐฑ์ค / BOJ 21922 ] ํ๋ถ ์ฐ๊ตฌ์ ๋ฏผ์ ( ์๋ฐ / JAVA ) (0) | 2022.02.21 |
[ BOJ / ๋ฐฑ์ค 5212 ] ์ง๊ตฌ ์จ๋ํ ( ์๋ฐ / JAVA ) (0) | 2022.02.15 |
[ ๋ฐฑ์ค / BOJ 20436 ] ZOAC 3 ( JAVA / ์๋ฐ ) (0) | 2022.02.15 |
[ ๋ฐฑ์ค / BOJ 21609 ] ์์ด ์คํ๊ต ( ์๋ฐ / JAVA ) (0) | 2022.02.14 |