말랑한 하루
[SW Expert Academy] 1873 상호의 배틀필드 [Java] 본문
반응형
[ 조건 ]
더보기
. | 평지(전차가 들어갈 수 있다.) |
* | 벽돌로 만들어진 벽 |
# | 강철로 만들어진 벽 |
- | 물(전차는 들어갈 수 없다.) |
^ | 위쪽을 바라보는 전차(아래는 평지이다.) |
v | 아래쪽을 바라보는 전차(아래는 평지이다.) |
< | 왼쪽을 바라보는 전차(아래는 평지이다.) |
> | 오른쪽을 바라보는 전차(아래는 평지이다.) |
문자 | 동작 |
U | Up : 전차가 바라보는 방향을 위쪽으로 바꾸고, 한 칸 위의 칸이 평지라면 위 그 칸으로 이동한다. |
D | Down : 전차가 바라보는 방향을 아래쪽으로 바꾸고, 한 칸 아래의 칸이 평지라면 그 칸으로 이동한다. |
L | Left : 전차가 바라보는 방향을 왼쪽으로 바꾸고, 한 칸 왼쪽의 칸이 평지라면 그 칸으로 이동한다. |
R | Right : 전차가 바라보는 방향을 오른쪽으로 바꾸고, 한 칸 오른쪽의 칸이 평지라면 그 칸으로 이동한다. |
S | Shoot : 전차가 현재 바라보고 있는 방향으로 포탄을 발사한다. |
[ 핵심풀이 ]
0) UDLR 4방향에 관해 이동할때, 방향을 먼저 변경하고, 맵밖을 벗어나지않고 평지일때 움직여준다.
1) 포탄을 발사할때는 강철벽을 만나기전까진 무시하고, 기본벽을 만나면 부셔 없애며, 맵밖까지 진행하도록한다
3) 이동하는 move, 포탄을쏘는 shoot, 맵범위판별하는 range, 맵을보여주는 view로 구현해준다
* Shoot을 구현하는 부분에서 범위판별을 먼저해줘야 런타임에러가 발생하지않음
테케 사이사이에는 빈공백(빈줄)이 없음
[ Java ]
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
class xy {
int y;
int x;
int dir;
xy(int y, int x, int dir) {
this.y=y;
this.x=x;
this.dir=dir;
}
public int getY() {
return y;
}
public void setY(int y) {
this.y = y;
}
public int getX() {
return x;
}
public void setX(int x) {
this.x = x;
}
public int getDir() {
return dir;
}
public void setDir(int dir) {
this.dir = dir;
}
}
public class _1873_상호의_배틀필드 {
static final int MAX = 21;
static int H, W;
static int cml; // CommandLine
static String cmand;// Command
static int ay[] = {-1,1,0,0}; //상 하 좌 우
static int ax[] = {0,0,-1,1};
static char tv[] = {'^', 'v', '<', '>'};
static char map[][];
static void init() throws NumberFormatException, IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
int TC = Integer.parseInt(br.readLine());
for(int t=1;t<=TC;t++) {
String b[] = br.readLine().split(" ");
H = Integer.parseInt(b[0]);
W = Integer.parseInt(b[1]);
map = new char[H][W];
xy start = null;
for(int i=0;i<H;i++) {
map[i] = br.readLine().toCharArray();
for(int j=0;j<W;j++) {
if (map[i][j] == '>') {
start = new xy(i,j,3);
}
else if(map[i][j] == '^') {
start = new xy(i,j,0);
}
else if(map[i][j] == 'v') {
start = new xy(i,j,1);
}
else if(map[i][j] == '<') {
start = new xy(i,j,2);
}
}
}
cml = Integer.parseInt(br.readLine());
cmand = br.readLine();
System.out.print("#"+t+" ");
solve(start);
}
}
static void solve(xy tank) {
if (tank==null) return;
for(int i=0;i<cml;i++) {
char type = cmand.charAt(i);
switch(type) {
case 'U':
tank.setDir(0);
move(tank);
break;
case 'D':
tank.setDir(1);
move(tank);
break;
case 'L':
tank.setDir(2);
move(tank);
break;
case 'R':
tank.setDir(3);
move(tank);
break;
case 'S':
shoot(tank);
break;
}
}
view();
}
static void move(xy tank) {
int dir = tank.getDir();
int y = tank.getY();
int x = tank.getX();
int ny = y+ay[dir];
int nx = x+ax[dir];
map[y][x] = tv[dir];
if (!range(ny, nx) && map[ny][nx] == '.') {
tank.setY(ny);
tank.setX(nx);
map[y][x] = '.';
map[ny][nx] = tv[dir];
}
}
static void shoot(xy tank) {
int dir = tank.getDir();
int y = tank.getY();
int x = tank.getX();
while(true) {
y+=ay[dir];
x+=ax[dir];
if (range(y, x) || map[y][x] == '#') break;
if (map[y][x] == '*') {
map[y][x] = '.';
break;
}
}
}
static boolean range(int y, int x) {
return y<0||x<0||y>H-1||x>W-1;
}
static void view() {
StringBuilder sb = new StringBuilder();
for(int i=0;i<H;i++) {
for(int j=0;j<W;j++) {
sb.append(map[i][j]);
}
sb.append("\n");
}
System.out.print(sb);
}
public static void main(String[] args) throws NumberFormatException, IOException {
init();
}
}
반응형
'문제풀이 > SWexpert Academy' 카테고리의 다른 글
[SW Expert Academy] 1223 계산기 2 [Java] (0) | 2021.02.07 |
---|---|
[SW Expert Academy] 7793 오! 나의 여신님 [Java] (0) | 2021.02.05 |
[SW Expert Academy] 1954 달팽이 숫자 [Java] (0) | 2021.02.02 |
[SW Expert Academy] 1210 Ladder1 [Java] (0) | 2021.02.02 |
[SW Expert Academy] 1860 진기의 최고급 붕어빵 [Java] (0) | 2021.02.01 |
Comments