728x90

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

 

SW Expert Academy

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

swexpertacademy.com

 

문제)

 

 

 

풀이)

사실 어려운 문제는 아닌데, 구현해야 할 부분이 많다.

진짜 빡구현 문제!!

 

map 정보를 받은 이후, direction에 따라 dir이라는 인덱스를 초기화해준다.

또한 명령어에 따라 switch를 통해 명령을 수행한다.

이때, S명령어에서 dir에 따라 포탄을 쏘고, map에 따라 변경되는 것을 업데이트 해준다. 

 

코드가 길어서 좀 보기 어려울 수는 있지만, 구조 자체는 어렵지 않다.

 

전차가 움직이는 부분과 포탄을 쏘는 부분을 따로 함수로 만들면 더 깔끔하다!

import java.util.Scanner;
import java.io.FileInputStream;

public class Solution_D3_1873_상호의배틀필드 {

	public static void main(String[] args) throws Exception{
		System.setIn(new FileInputStream("input.txt"));
		Scanner sc = new Scanner(System.in);
		int T;
		T=sc.nextInt();

		for(int test_case = 1; test_case <= T; test_case++)
		{
			
			int H = sc.nextInt();
			int W = sc.nextInt();
			char[][] map = new char[H][W];
			char direction = '*'; // 전차 방향
			int dir=-1; // 전차 방향 인덱스 
			int x=0, y=0;	//전차 위치
			// map 입력
			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] == 'v' || map[i][j] == '<' || map[i][j] == '>') {
						direction = map[i][j];
						x = i;
						y = j;
					}	
				}
			}
			switch(direction) {
				case '^':
					dir=0;
					break;
				case 'v':
					dir=1;
					break;
				case '<':
					dir=2;
					break;
				case '>':
					dir=3;
					break;
			}
			
			// 명령어 입력
			int N = sc.nextInt();
			char[] cmd = new char[N];
			String temp = sc.next();
			cmd = temp.toCharArray();
			
			// U D L R
			//char[] d = {'U', 'D', 'L', 'R', 'S'};
			int[] dx = {-1, 1, 0, 0}; // row
			int[] dy = {0, 0, -1, 1}; //col
			
			for(int i=0; i<N; i++) {
				char c = cmd[i];
				
				switch(c) {
					case 'U':{
						dir=0;
						map[x][y] = '^';
						int nx = x + dx[dir];
						int ny = y + dy[dir];
						if(0<=nx && nx<H && 0<=ny && ny<W && map[nx][ny] == '.') {
							map[nx][ny] = map[x][y];
							map[x][y]='.';
							x=nx;
							y=ny;
						}
						break;
					}
						
					case 'D':{
						dir=1;
						map[x][y] = 'v';
						int nx = x + dx[dir];
						int ny = y + dy[dir];
						if(0<=nx && nx<H && 0<=ny && ny<W && map[nx][ny] == '.') {
							map[nx][ny] = map[x][y];
							map[x][y]='.';
							x=nx;
							y=ny;
						}
						break;
					}
						
					case 'L':{
						dir=2;
						map[x][y] = '<';
						int nx = x + dx[dir];
						int ny = y + dy[dir];
						if(0<=nx && nx<H && 0<=ny && ny<W && map[nx][ny] == '.') {
							map[nx][ny] = map[x][y];
							map[x][y]='.';
							x=nx;
							y=ny;
						}
						break;
					}
						
					case 'R':{
						dir=3;
						map[x][y] = '>';
						int nx = x + dx[dir];
						int ny = y + dy[dir];
						if(0<=nx && nx<H && 0<=ny && ny<W && map[nx][ny] == '.') {
							map[nx][ny] = map[x][y];
							map[x][y]='.';
							x=nx;
							y=ny;
						}
						break;
					}
						
					case 'S':
						int s_idx=0;
						switch(dir) {
							case 0://U
								s_idx = x;
								while(true) {
									if(s_idx-1<0 || map[s_idx-1][y]=='#')
										break;
									if(map[s_idx-1][y] == '*') {
										map[s_idx-1][y] = '.';
										break;
									}
									s_idx--;
								}
								break;

							case 1:
								s_idx = x;
								while(true) {
									if(s_idx+1>=H || map[s_idx+1][y]=='#')
										break;
									if(map[s_idx+1][y] == '*') {
										map[s_idx+1][y] = '.';
										break;
									}
									s_idx++;
								}
								break;
								
							case 2:
								s_idx = y;
								while(true) {
									if(s_idx-1<0 || map[x][s_idx-1]=='#')
										break;
									if(map[x][s_idx-1] == '*') {
										map[x][s_idx-1] = '.';
										break;
									}
									s_idx--;
								}
								break;
								
							case 3:
								s_idx = y;
								while(true) {
									if(s_idx+1>=W || map[x][s_idx+1]=='#')
										break;
									if(map[x][s_idx+1] == '*') {
										map[x][s_idx+1] = '.';
										break;
									}
									s_idx++;
								}
								break;
						}//case S
						break;
				}//switch
				
			}//cmd
			
			//출력
			System.out.print("#"+test_case+" ");
			for(int i=0; i<H; i++) {
				for(int j=0; j<W; j++) {
					System.out.print(map[i][j]);
				}
				System.out.println();
			}
			
		
		}//test_case
		sc.close();
	}//main
}

 

 

728x90

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

SWEA 1218. 괄호 짝짓기(JAVA)  (0) 2022.08.12
SWEA 2805. 농작물 수확하기(JAVA)  (0) 2022.08.12
SWEA 1954. 달팽이 숫자(JAVA)  (0) 2022.08.08
SWEA 1210. Ladder1(JAVA)  (0) 2022.08.07
SWEA 1208. Flatten(JAVA)  (0) 2022.08.07

+ Recent posts