본문 바로가기
Algorithm(알고리즘)/SWEA(SW Expert Academy)

[SWEA][Java][D3][시물레이션] 1873 - 상호의 배틀필드

by Jun_N 2021. 2. 3.

swexpertacademy.com/main/code/problem/problemDetail.do?contestProbId=AV5LyE7KD2ADFAXc&categoryId=AV5LyE7KD2ADFAXc&categoryType=CODE&problemTitle=1873&orderBy=FIRST_REG_DATETIME&selectCodeLang=ALL&select-1=&pageSize=10&pageIndex=1

 

SW Expert Academy

SW 프로그래밍 역량 강화에 도움이 되는 다양한 학습 컨텐츠를 확인하세요!

swexpertacademy.com

 


문제 풀이

 

이 문제는 삼성이 좋아하는 전형적인 시물레이션 문제이다.

 

삼성에서 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;
	}

}