Notice
Recent Posts
Link
- Today
- Total
hye-log
[SWEA]1873번 상호의 배틀필드(JAVA) 본문
0. 문제 링크
https://swexpertacademy.com/main/code/problem/problemDetail.do?contestProbId=AV5LyE7KD2ADFAXc
1. 문제 설명
1) U, D, L, R 이고 포차 방향을 바꾸고 벽이 아니면 한 칸 이동
2) S 일 때 평지, 물이면 통과 / 벽돌이면 부시기 / 강철이면 멈춤
2. 입출력
// input
1
3 7
***....
*-..#**
#<.****
23
SURSSSSUSLSRSSSURRDSRDS
// output
#1 **....v
.-..#..
#......
3. 코드
import java.util.*;
public class swea1873 {
public static final char UP = '^';
public static final char DOWN = 'v';
public static final char LEFT = '<';
public static final char RIGHT = '>';
public static final char GROUND = '.';
public static final char WALL = '*';
public static final char STEEL = '#';
public static final char WATER = '-';
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
int T = sc.nextInt();
for(int t = 1; t <= T; t++) {
int H = sc.nextInt(); // 높이
int W = sc.nextInt(); // 너비
char[][] map = new char[H][W]; // 게임 맵
int r = 0; // 포차의 좌표
int c = 0;
for(int h = 0; h < H; h++) {
String str = sc.next();
for(int w = 0; w < W; w++) {
map[h][w] = str.charAt(w);
// 포차면 좌표 저장
if(map[h][w] == LEFT || map[h][w] == RIGHT || map[h][w] == UP || map[h][w] == DOWN) {
r = h;
c = w;
}
}
}
int N = sc.nextInt(); // 사용자가 넣을 입력의 개수
String str = sc.next(); // 길이가 N인 문자열
int[] dr = {-1, 1, 0, 0};
int[] dc = {0, 0, -1, 1};
for(int s = 0; s < N; s++) {
switch(str.charAt(s)) {
case 'U': // up
if(r-1 >= 0 && r-1 < H && map[r-1][c] == GROUND ) { // 위쪽으로 갔을 때 평지라면
map[r--][c] = GROUND ; // 평지로 만들기
}
map[r][c] = UP; // 포차 위쪽 방향으로 변경
break;
case 'D': // down
if(r+1 >= 0 && r+1 < H && map[r+1][c] == GROUND) { // 아래쪽으로 갔을 때 평지라면
map[r++][c] = GROUND ; // 평지로 만들기
}
map[r][c] = DOWN; // 아래쪽 방향으로 변경
break;
case 'L': // left
if(c-1 >= 0 && c-1 < W && map[r][c-1] == GROUND) { // 왼쪽으로 갔을 때 평지라면
map[r][c--] = GROUND ; // 평지로 만들기
}
map[r][c] = LEFT; // 왼쪽 방향으로 변경
break;
case 'R': // right
if(c+1 >= 0 && c+1 < W && map[r][c+1] == GROUND) { // 오른쪽으로 갔을 때 평지라면
map[r][c++] = GROUND ; // 평지로 만들기
}
map[r][c] = RIGHT; // 오른쪽 방향으로 변경
break;
case 'S': // shoot
int d = -1;
switch(map[r][c]) {
case(UP):
d = 0;
break;
case(DOWN):
d = 1;
break;
case(LEFT):
d = 2;
break;
case(RIGHT):
d = 3;
break;
default:
break;
}
int nr = r + dr[d];
int nc = c + dc[d];
while(true) {
if(nr >= 0 && nr < H && nc >= 0 && nc < W) {
if(map[nr][nc] == WALL) { // 벽돌이면 땅으로 만들기
map[nr][nc] = GROUND;
break;
} else if(map[nr][nc] == STEEL) { // 강철이면 멈춤
break;
} else { // 나머지는 직진
nr += dr[d];
nc += dc[d];
}
} else {
break;
}
}
break;
default:
break;
}
}
// 출력
System.out.printf("#%d ", t);
for(int h = 0; h < H; h++) {
for(int w = 0; w < W; w++) {
System.out.printf("%c", map[h][w]);
}
System.out.println();
}
}
}
}
실행 결과
4. 회고
1) 맵에 대한 정보가 문자라서 final 변수로 선언
2) switch 문을 이용하여 경우를 빠르게 찾고 값을 변경
5. Github
https://github.com/iihye/Algorithm/blob/main/SWEA/swea1873.java
728x90
'CodingTest > SWEA' 카테고리의 다른 글
[SWEA]6730번 장애물 경주 난이도(JAVA) (0) | 2023.07.30 |
---|---|
[SWEA]1859번 백만 장자 프로젝트(JAVA) (0) | 2023.07.30 |
[SWEA]1289번 원재의 메모리 복구하기(JAVA) (0) | 2023.07.30 |
[SWEA]5432번 쇠막대기 자르기(JAVA) (0) | 2023.07.30 |
[SWEA]1940번 가랏! RC카!(JAVA) (0) | 2023.07.30 |
Comments