본문 바로가기
알고리즘/SWEA

[Java] SWEA1873_상호의배틀필드

by 댕꼬 2022. 3. 16.
728x90

https://swexpertacademy.com/main/code/problem/problemDetail.do?contestProbId=AV5LyE7KD2ADFAXc 

 

SW Expert Academy

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

swexpertacademy.com

상호의 배틀필드 게임 맵의 구성요소

[게임규칙]

- 전차는 맵안에서만 이동한다

- 전차가 포탄 발사하면, 포탄은 벽돌벽 혹은 강철벽에 충돌하거나 맵 밖으로 나갈때까지 직진한다.

- 포탄이 벽돌벽에 부딪힐 경우 벽은 무너지고 이 칸은 평지가된다.

- 포탄이 강철벽에 부딪힐 경우 아무일도 일어나지 않는다.

- 포탄이 맵밖으로 나가면 아무일도 일어나지 않는다.

 

[입력]

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

댓글