문제풀이
[SW Academy] 1873 상호의 배틀필드 - JAVA
자르비옹스
2022. 2. 4. 14:49
델타를 사용하여 구현하는 문제였다.
처음에 런타임 에러가 계속 발생하여 애를 먹었는데, 평지로 이동하는 구간에서 index 범위 체크를 하지 않았기 때문이었다.
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
public class Solution {
static int[] dy = { -1, 0, 1, 0 };
static int[] dx = { 0, 1, 0, -1 };
static char[] dir = { '^', '>', 'v', '<' };
static int currentDir = -1;
public static void main(String[] args) throws NumberFormatException, IOException {
BufferedReader in = new BufferedReader(new InputStreamReader(System.in));
int T = Integer.parseInt(in.readLine());
StringBuilder sb = new StringBuilder();
for (int tc = 1; tc <= T; tc++) {
sb.append("#").append(tc).append(" ");
String s = in.readLine();
int H = Integer.parseInt(s.split(" ")[0]);
int W = Integer.parseInt(s.split(" ")[1]);
char[][] map = new char[H][W];
for (int i = 0; i < H; i++) {
map[i] = in.readLine().toCharArray();
}
int cmdNum = Integer.parseInt(in.readLine());
char[] cmd = in.readLine().toCharArray();
// LOGIC
// 전차 위치 찾기
int x = 0;
int y = 0;
boolean status = false;
for (int i = 0; i < H; i++) {
for (int j = 0; j < W; j++) {
if (map[i][j] == '<' || map[i][j] == '>' || map[i][j] == 'v' || map[i][j] == '^') {
x = j;
y = i;
if(map[i][j] == '^') currentDir=0;
if(map[i][j] == '>') currentDir=1;
if(map[i][j] == 'v') currentDir=2;
if(map[i][j] == '<') currentDir=3;
status = true;
break;
}
}
if (status)
break;
}
// command
for (int i = 0; i < cmdNum; i++) {
int idx = -1;
if (cmd[i] == 'U') {
idx = 0;
} else if (cmd[i] == 'R') {
idx = 1;
} else if (cmd[i] == 'D') {
idx = 2;
} else if (cmd[i] == 'L') {
idx = 3;
} else if (cmd[i] == 'S') {
// shoot
int nextY = y+dy[currentDir];
int nextX = x+dx[currentDir];
while(nextY < H && nextY >= 0 && nextX < W && nextX >= 0) {
if(map[nextY][nextX] == '*') {
// 벽돌 벽이라면 부순다
map[nextY][nextX] = '.';
break;
}else if(map[nextY][nextX] == '#') {
// 강철 벽이라면
break;
}
nextY += dy[currentDir];
nextX += dx[currentDir];
}
continue;
}
int nextY = y+dy[idx];
int nextX = x+dx[idx];
// 바라보는 방향 바꾸기
currentDir = idx;
if(nextY < H && nextY >= 0 && nextX < W && nextX >= 0 && map[nextY][nextX] == '.') {
// 평지라면 GO
map[y][x] = '.';
y = nextY;
x = nextX;
}
}
// 전차 찍기
map[y][x] = dir[currentDir];
for (int i = 0; i < map.length; i++) {
sb.append(map[i]).append('\n');
}
}
System.out.println(sb);
}
}