SSAFY/SWEA

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

믕비 2023. 5. 1. 18:43

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

 

SW Expert Academy

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

swexpertacademy.com

만들어야 할 메소드가 많았지만 어려운 문제는 아니었다.

 

내 코드

메모리 : 21136 KB

시간 : 125 ms

코드길이 : 4357 B

 

[내 코드]

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.StringTokenizer;

public class Solution {
	static char[][] map;
	static int N;
	static int H;
	static int W;
	static String order;
	static int spotRow;
	static int spotColumn;
	static int nowDir;
	//상, 하, 좌, 우
	static int[] direction = {-1, 1, -1, 1};
	
	public static void main(String[] args) throws IOException{
		BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
		StringBuilder sb = new StringBuilder();
		StringTokenizer st;
		
		int T = Integer.parseInt(br.readLine());
		for(int t = 1; t <= T; t++) {
			sb.append('#').append(t).append(' ');
			 st = new StringTokenizer(br.readLine());
			 H = Integer.parseInt(st.nextToken());
			 W = Integer.parseInt(st.nextToken());
			 
			 map = new char[H][W];
			 for(int h = 0; h < H; h++) {
				 String row = br.readLine();
				 for(int w = 0; w < W; w++) {
					 map[h][w] = row.charAt(w);
					 if(map[h][w] == '<' || map[h][w] == '>' || map[h][w] == '^' || map[h][w] == 'v') {
						 switch(map[h][w]) {
						 case '^':
							 nowDir = 0;
							 break;
						 case 'v':
							 nowDir = 1;
							 break;
						 case '<':
							 nowDir = 2;
							 break;
						 case '>':
							 nowDir = 3;
							 break;
						 }
						 spotRow = h;
						 spotColumn = w;
					 }
						 
				 }
			 }
			 
			 N = Integer.parseInt(br.readLine());
			 order = br.readLine();
			 
			 game();
			 
			 for(int h = 0; h < H; h++) {
				 for(int w = 0; w < W; w++) {
					 sb.append(map[h][w]);
				 }
				 sb.append('\n');
			 }
		}
		System.out.print(sb);
	}
	
	public static void game() {
		for(int n = 0; n < N; n++) {
			switch(order.charAt(n)) {
			case 'U':
				Up();
				break;
			case 'D':
				Down();
				break;
			case 'L':
				Left();
				break;
			case 'R':
				Right();
				break;
			case 'S':
				Shoot();
				break;
			}
		}
	}
	public static void Up() {
		nowDir = 0;
		map[spotRow][spotColumn] = '^';
		if(spotRow - 1 < 0)
			return;
		if(map[spotRow - 1][spotColumn] == '.') {
			change(spotRow, spotColumn, spotRow - 1, spotColumn);
			spotRow -= 1;
		}
		return;
	}
	
	public static void Down() {
		nowDir = 1;
		map[spotRow][spotColumn] = 'v';
		if(spotRow + 1 == H)
			return;
		if(map[spotRow + 1][spotColumn] == '.') {
			change(spotRow, spotColumn, spotRow + 1, spotColumn);
			spotRow += 1;
		}
		return;
	}
	
	public static void Left() {
		nowDir = 2;
		map[spotRow][spotColumn] = '<';
		if(spotColumn - 1 < 0)
			return;
		if(map[spotRow][spotColumn - 1] == '.') {
			change(spotRow, spotColumn, spotRow, spotColumn - 1);
			spotColumn -= 1;
		}
		return;
	}
	
	public static void Right() {
		nowDir = 3;
		map[spotRow][spotColumn] = '>';
		if(spotColumn + 1 == W)
			return;
		if(map[spotRow][spotColumn + 1] == '.') {
			change(spotRow, spotColumn, spotRow, spotColumn + 1);
			spotColumn += 1;
		}
		return;
	}
	
	public static void Shoot() {
		int nowRow = spotRow;
		int nowColumn = spotColumn;
		
		switch(nowDir) {
		//위
		case 0:
			while(true) {
				nowRow += direction[nowDir];
				if(nowRow < 0)
					break;
				//벽돌벽이면
				if(map[nowRow][spotColumn] == '*') {
					map[nowRow][spotColumn] = '.';
					break;
				}
				//강철벽이면
				if(map[nowRow][spotColumn] == '#')
					break;
			}
			break;
		//아래
		case 1:
			while(true) {
				nowRow += direction[nowDir];
				if(nowRow == H)
					break;
				//벽돌벽이면
				if(map[nowRow][spotColumn] == '*') {
					map[nowRow][spotColumn] = '.';
					break;
				}
				//강철벽이면
				if(map[nowRow][spotColumn] == '#')
					break;
			}
			break;
		//좌
		case 2:
			while(true) {
				nowColumn += direction[nowDir];
				if(nowColumn < 0)
					break;
				if(map[spotRow][nowColumn] == '*') {
					map[spotRow][nowColumn] = '.';
					break;
				}
				if(map[spotRow][nowColumn] == '#')
					break;
			}
			break;
		//우
		case 3:
			while(true) {
				nowColumn += direction[nowDir];
				if(nowColumn == W)
					break;
				if(map[spotRow][nowColumn] == '*') {
					map[spotRow][nowColumn] = '.';
					break;
				}
				if(map[spotRow][nowColumn] == '#')
					break;
			}
			break;
		}
		return;
	}
	
	public static void change(int nowR, int nowC, int nextR, int nextC) {
		char temp = map[nextR][nextC];
		map[nextR][nextC] = map[nowR][nowC];
		map[nowR][nowC] = temp;
		
		return;
	}
}

'SSAFY > SWEA' 카테고리의 다른 글

[SWEA] 9229 : 한빈이와 spot Mart  (0) 2023.05.02
[SWEA] 5607 : 조합 (풀이중)  (0) 2023.05.02
[SWEA] 6190 : 정곤이의 단조 증가하는 수  (0) 2023.05.01
[SWEA] 2814 : 최장경로  (0) 2023.05.01
[SWEA] 2805 : 농작물 수확하기  (0) 2023.04.30