문제 풀이
이 문제는 삼성이 좋아하는 전형적인 시물레이션 문제이다.
삼성에서 A형 문제에서 시물레이션이 많이 나오니 상하좌우를 잘 사용하여 2차원 배열을 만지는 것을 연습을 많이 하는것을 추천한다.
상하좌우 방향키를 4개를 미리 저장해두고 상하좌우에 따라서 x와 y를 손쉽게 이용해주면 된다.
Command를 하나씩 확인하면서 U,D,L,R이면 changeDirection() 메서드를 통해 현재의 방향을 바꿔준다.
가려는 방향이 범위를 초과하거나 평지가 아닌 경우는 이동시키지 않고 평지인 경우만 이동시켜준다.
이동시켜 주고 기존 위치는 평지로 바꿔주고 현재의 위치를 다시 저장해주면 된다.
S인 경우 범위를 초과하기 전까지 While문으로 돌려주는데 1씩 증가시켜주면서 벽을 만나면 상황에 맞게 처리해준다.
import java.util.Scanner;
// SWEA 1873 배틀필드
// 시물레이션
public class Solution {
//상하좌우
static int[] dx= {-1,1,0,0};
static int[] dy= {0,0,-1,1};
static int d=0;
static Character[][] map;
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
int T=sc.nextInt();
for(int tc=1;tc<=T;tc++) {
int H=sc.nextInt();
int W=sc.nextInt();
int x=0;
int y=0;
int nx,ny=0;
map=new Character[H][W];
for(int i=0;i<H;i++) {
String temp=sc.next();
for(int j=0;j<W;j++) {
map[i][j]=temp.charAt(j);
if(map[i][j]=='<' || map[i][j]=='^' || map[i][j]=='v' || map[i][j]=='>') {
if(map[i][j] =='^')
d=0;
else if(map[i][j] =='v')
d=1;
else if(map[i][j]=='<')
d=2;
else
d=3;
x=i;
y=j;
}
}
}
int N = sc.nextInt();
String command=sc.next();
// 입력 끝.
// Command 돌기!
for(int i=0;i<N;i++) {
Character com=command.charAt(i);
if(com=='S') { // 포탄 발사
int c=1;
while(true){
nx=x+(dx[d]*c);
ny=y+(dy[d]*c);
if(nx <0 || nx >=H || ny<0 || ny>=W)
break;
if(map[nx][ny]=='#')
break;
else if(map[nx][ny]=='*') {
map[nx][ny]='.';
break;
}
c++;
}
} else { // 이동
changeDirection(com,x,y);
nx=x+dx[d];
ny=y+dy[d];
// 범위 초과로 이동 불가 상태.
if(nx <0 || nx >=H || ny<0 || ny>=W)
continue;
if(map[nx][ny] =='.') { //평지면
map[nx][ny]=map[x][y]; // 전차 이동.
map[x][y]='.'; // 기존 위치 평지로 바꿈.
x=nx; // 이동 위치 저장.
y=ny;
}
}
}
// 출력!
System.out.printf("#%d ",tc);
for(int i=0;i<H;i++) {
for(int j=0;j<W;j++) {
System.out.print(map[i][j]);
}
System.out.println();
}
}
}
// 방향 전차 바꿔주기
private static void changeDirection(Character com,int x,int y) {
if (com=='U') {
map[x][y]='^';
d=0;
}else if(com=='D') {
map[x][y]='v';
d=1;
}else if(com=='L') {
map[x][y]='<';
d=2;
}else if(com=='R') {
map[x][y]='>';
d=3;
}
return;
}
}
'Algorithm(알고리즘) > SWEA(SW Expert Academy)' 카테고리의 다른 글
[SWEA][Java][모의 SW][DFS] 2105 - 디저트 카페 (0) | 2021.04.16 |
---|---|
[SWEA][Java][D4][최소 신장 트리,크루스칼] 1251 - 하나로 (0) | 2021.03.29 |
[SWEA][Java][D2] 1204 - [S/W 문제해결 기본] 1일차 - 최빈수 구하기 (0) | 2021.01.26 |
[SWEA][Java][D2] 1954 - 달팽이 숫자 (0) | 2021.01.24 |
[SWEA][Java][D2] 1983 - 조교의 성적 매기기 (HashMap) (0) | 2021.01.18 |