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();
			}
		}
	}
}'알고리즘 > 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 | 
 
										
									 
										
									 
										
									 
										
									
댓글