문제
맵 정보
문자 | 의미 |
. | 평지(전차가 들어갈 수 있다.) |
* | 벽돌로 만들어진 벽 |
# | 강철로 만들어진 벽 |
- | 물(전차는 들어갈 수 없다.) |
^ | 위쪽을 바라보는 전차(아래는 평지이다.) |
v | 아래쪽을 바라보는 전차(아래는 평지이다.) |
< | 왼쪽을 바라보는 전차(아래는 평지이다.) |
> | 오른쪽을 바라보는 전차(아래는 평지이다.) |
사용자의 명령어
문자 | 동작 |
U | Up : 전차가 바라보는 방향을 위쪽으로 바꾸고, 한 칸 위의 칸이 평지라면 위 그 칸으로 이동한다. |
D | Down : 전차가 바라보는 방향을 아래쪽으로 바꾸고, 한 칸 아래의 칸이 평지라면 그 칸으로 이동한다. |
L | Left : 전차가 바라보는 방향을 왼쪽으로 바꾸고, 한 칸 왼쪽의 칸이 평지라면 그 칸으로 이동한다. |
R | Right : 전차가 바라보는 방향을 오른쪽으로 바꾸고, 한 칸 오른쪽의 칸이 평지라면 그 칸으로 이동한다. |
S | Shoot : 전차가 현재 바라보고 있는 방향으로 포탄을 발사한다. |
위와 같은 맵의 정보와 사용자의 명령어가 주어질 때,
사용자의 명령어를 전부 실행하고 난 뒤 맵을 출력하는 문제
풀이방법
각 명령어 따라 처리
소스코드
package samsung;
import java.util.*;
public class s_1873 {
static int w;
static int h;
static int x;
static int y;
static int dx;
static int dy;
static char[][] map;
public static void position(char c, int i, int j) {
if(c == '>') {
dx = 1;
dy = 0;
x = j;
y = i;
}
else if(c == '<') {
dx = -1;
dy = 0;
x = j;
y = i;
}
else if(c == '^') {
dx = 0;
dy = -1;
x = j;
y = i;
}
else if(c == 'v') {
dx = 0;
dy = 1;
x = j;
y = i;
}
}
public static void instruction(char com) {
if(com == 'S') {
int cx = x;
int cy = y;
while(cx + dx >= 0 && cy + dy >= 0 && cx + dx < w && cy + dy < h) {
if(map[cy + dy][cx+dx] == '*') {
map[cy+dy][cx+dx] = '.';
break;
}
else if(map[cy+dy][cx+dx] == '#') {
break;
}
cx += dx;
cy += dy;
}
}
else {
if(com == 'U') {
dx = 0;
dy = -1;
map[y][x] = '^';
}
else if(com == 'L') {
dx = -1;
dy = 0;
map[y][x] = '<';
}
else if(com == 'R') {
dx = 1;
dy = 0;
map[y][x] = '>';
}
else if(com == 'D') {
dx = 0;
dy = 1;
map[y][x] = 'v';
}
if(y+dy >= 0 && x + dx >= 0 && x +dx < w && y + dy < h) {
if(map[y + dy][x + dx] == '.') {
map[y + dy][x + dx] = map[y][x];
map[y][x] = '.';
x += dx;
y += dy;
}
}
}
}
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
int test = sc.nextInt();
for(int t = 1; t <= test; t++) {
h = sc.nextInt();
w = sc.nextInt();
dx = 0;
dy = 0;
x = 0;
y = 0;
map = new char[h][w];
for(int i = 0; i < h; i++) {
String s = sc.next();
for(int j = 0; j < w; j++) {
map[i][j] = s.charAt(j);
position(map[i][j], i, j);
}
}
int ins_num = sc.nextInt();
String ins = sc.next();
for(int i = 0; i < ins.length(); i++) {
char com = ins.charAt(i);
instruction(com);
}
System.out.print("#" + t + " ");
for(int i = 0; i < h; i++) {
for(int j = 0; j < w; j++) {
System.out.print(map[i][j]);
}
System.out.println();
}
}
}
}
'Problem Solving > SWEA' 카테고리의 다른 글
[SWEA] 5431. 민석이의 과제 체크하기 (0) | 2020.02.22 |
---|---|
[SWEA] 3809. 화섭이의 정수 나열 (0) | 2020.02.22 |
[SWEA] 5356. 의석이의 세로로 말해요 (0) | 2020.02.21 |
[SWEA] 5162. 두가지 빵의 딜레마 (0) | 2020.02.21 |
[SWEA] 4751. 다솔이의 다이아몬드 장식 (0) | 2020.02.21 |
댓글