728x90
https://swexpertacademy.com/main/code/problem/problemDetail.do?contestProbId=AV5LyE7KD2ADFAXc
[게임규칙]
- 전차는 맵안에서만 이동한다
- 전차가 포탄 발사하면, 포탄은 벽돌벽 혹은 강철벽에 충돌하거나 맵 밖으로 나갈때까지 직진한다.
- 포탄이 벽돌벽에 부딪힐 경우 벽은 무너지고 이 칸은 평지가된다.
- 포탄이 강철벽에 부딪힐 경우 아무일도 일어나지 않는다.
- 포탄이 맵밖으로 나가면 아무일도 일어나지 않는다.
[입력]
4 6 //맵의 크기 4*6
*.*..* //현재 맵의 구성요소
*.....
..-...
^.*#..
10 //명령어개수
SRSSRRUSSR //명령어
[출력]
#1 *....*
......
..-...
..>#..
[풀이]
처음 풀어보는 시뮬레이션 문제라 여러방법으로 풀다 결국은 모든 경우의수를 다 고려하여 case문 남발로 풀었다..
(그래서 코드가 매우 길어지긴 했지만 보기에 쉽고 직관적이라 나름대로 만족은 한다!)
워크샵 시간내에다 풀지못해 주말까지 머리를 끙끙 싸매고 겨우 푼 문제!
핵심은 "전차 벽에 막혀 움직이지 못하더라도 바라보고 있는 방향은 바꿔줘야 함"이다.
또한 case문에서 break문 항상 신경써주기!!
오래걸린만큼 Pass가 떴을때 너무 기뻐 소리를질렀다!
상호 내 친구였으면 딱콩 5대....
import java.util.Scanner;
public class swea1873_battle {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
int tc = sc.nextInt();
for (int t = 0; t < tc; t++) {
int H = sc.nextInt(); //높이
int W = sc.nextInt(); //너비
sc.nextLine();
int x = 0, y = 0; //전차의 위치를 저장할 변수
int[] dx = { -1, 0, 1, 0 }; // 상,우,하,좌 (U,R,D,L)
int[] dy = { 0, 1, 0, -1 };
char car = 'o';
// 게임 맵 만들면서 전차 찾기 (input값 입력)
char[][] map = new char[H][W];
for (int r = 0; r < H; r++) {
String s = sc.nextLine();
for (int c = 0; c < W; c++) {
map[r][c] = s.charAt(c);
if (map[r][c] == '>' | map[r][c] == '^' | map[r][c] == '<' | map[r][c] == 'v') {
x = r;
y = c;
car = map[r][c]; // 현재 바라보고 있는 위치
}
}
}
// 명령어 받아오기
int num = sc.nextInt();
sc.nextLine();
char[] arr = new char[num];
String input = sc.nextLine();
for (int i = 0; i < num; i++) {
arr[i] = input.charAt(i); //String -> char로 데이터타입 변환하면서 배열에 저장
}
int nx = 0, ny = 0; //전차의 새로운위치 (명령어에 따른 다음위치)
// 명령어 URDLS 수행
for (int i = 0; i < num; i++) {
switch (arr[i]) { //arr[] : 명령어배열
case 'U':
nx = x + dx[0];
ny = y + dy[0];
car = '^';
if (nx >= 0 && map[nx][ny] == '.') {
// 새로운 위치가 맵을 벗어나지 않고 평지이면
map[x][y] = '.'; // 현재위치 평지로 만들고
map[nx][ny] = '^'; // 새로운 위치에 위를 바라보는 방향
x = nx; // 현재위치 수정
y = ny;
} else {
map[x][y] = '^'; // 평지가 아니면, 바라보는 방향만 변경
}
break;
case 'R':
nx = x + dx[1];
ny = y + dy[1];
car = '>';
if (ny < W && map[nx][ny] == '.') {
map[x][y] = '.';
map[nx][ny] = '>';
x = nx;
y = ny;
} else {
map[x][y] = '>';
}
break;
case 'D':
nx = x + dx[2];
ny = y + dy[2];
car = 'v';
if (nx < H && map[nx][ny] == '.') {
map[x][y] = '.';
map[nx][ny] = 'v';
x = nx;
y = ny;
} else {
map[x][y] = 'v';
}
break;
case 'L':
nx = x + dx[3];
ny = y + dy[3];
car = '<';
if (ny >= 0 && map[nx][ny] == '.') {
map[x][y] = '.';
map[nx][ny] = '<';
x = nx;
y = ny;
} else {
map[x][y] = '<';
}
break;
case 'S':
switch (car) { //car : 현재전차가바라보는방향
case '^':
for (int j = x - 1; j >= 0; j--) { //현재위치 위부터 맨위까지
if (map[j][y] == '*') { //벽돌벽만나면
map[j][y] = '.'; //평지만들기
break;
}
if (map[j][y] == '#') //강철벽만나면 종료
break;
}
break;
case '>':
for (int j = y + 1; j < W; j++) {
if (map[x][j] == '*') {
map[x][j] = '.';
break;
}
if (map[x][j] == '#')
break;
}
break;
case 'v':
for (int j = x + 1; j < H; j++) {
if (map[j][y] == '*') {
map[j][y] = '.';
break;
}
if (map[j][y] == '#')
break;
}
break;
case '<':
for (int j = y - 1; j >= 0; j--) {
if (map[x][j] == '*') {
map[x][j] = '.';
break;
}
if (map[x][j] == '#')
break;
}
break;
}
break;
}
}
System.out.printf("#%d ", t + 1);
for (char[] r : map) {
for (char c : r) {
System.out.print(c);
}
System.out.println();
}
}
}
}
728x90
'알고리즘 > SWEA' 카테고리의 다른 글
[Java] SWEA1218_괄호짝짓기 (0) | 2022.03.16 |
---|---|
[Java] SWEA2805_농작물수확하기 (0) | 2022.03.16 |
[Java] SWEA1208_Flatten (0) | 2022.03.16 |
[Java] SWEA2001_파리퇴치 (0) | 2022.03.16 |
[Java] SWEA1289_원재의메모리복구하기 (0) | 2022.03.12 |
댓글