본문 바로가기
Problem Solving/SWEA

[SWEA] 1873. 상호의 배틀필드

by 테리는당근을좋아해 2020. 2. 22.

문제

맵 정보

문자 의미
. 평지(전차가 들어갈 수 있다.)
* 벽돌로 만들어진 벽
# 강철로 만들어진 벽
- 물(전차는 들어갈 수 없다.)
^ 위쪽을 바라보는 전차(아래는 평지이다.)
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();
			}
			
		}
	}
}

댓글