본문 바로가기

코딩테스트

[JAVA-D3] SWEA 1873 - 상호의 배틀필드

728x90
 

SW Expert Academy

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

swexpertacademy.com

 

✅ 문제 요약

전차는 상하좌우, 포탄 발사가 가능하며 만약 2종류의 벽이나 물을 만나면 해당 방향으로 진행할 수 없다.

또한 포탄을 발사했을 때 맵의 끝까지 날아가며 벽돌 벽을 만나면 해당 벽을 부수어 평지로 만들고 포탄은

사라지며 강철 벽을 만나면 아무 일도 일어나지 않는다.

명령어를 순차적으로 실행했을 때의 map의 상태를 출력하라.

 

🤔 문제 풀이

별다른 알고리즘이 필요하지 않은 완전 빡구현 문제였다.

난이도가 높지 않았지만 워낙 문제에서 주어지는 조건들이 많기 때문에 

문제를 잘 읽고 요구사항을 잘 구현해야 했으며 예외사항도 잘 체크해야 했다.

 

또한 지나칠 수 있는 조건이 하나 있는데 만약 전차가 상하좌우 중 어떤 방향으로 이동하고자 할 때

다음 좌표가 전차가 이동할 수 없는 공간일 경우 이동은 하지 않지만 전차의 방향은 해당 방향으로 돌려주어야한다.

 

정답을 맞춰놓고 보니 코드 길이가 꽤 길어졌는데 기능 별로 모듈화하여 코딩한 덕분에 예외 사항이 발생했을 때

어디가 문제인지 바로바로 찾아낼 수 있었고 헷갈리지 않고 잘 풀어낸 것 같다.

비록 프로젝트 개발이 아닌 코테지만 문제에서 주어지는 기능 별로 모듈화 하는 습관을 생활화 하도록 하자.

 

🚨CODE

import java.util.*;
import java.io.*;
 
public class Solution {
	static int n, m;
	static String[][] map;
	static int startx, starty;
    public static void main(String[] args) throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));
         
        int testCase = Integer.parseInt(br.readLine());
        
        for(int t = 1; t<=testCase; t++) {
        	StringTokenizer st = new StringTokenizer(br.readLine());
            n = Integer.parseInt(st.nextToken());
            m = Integer.parseInt(st.nextToken());
            map = new String[n][m];
            
            startx = 0; starty = 0;
            for(int i = 0; i<n; i++) {
            	String[] str = br.readLine().split("");
            	for(int j = 0; j<m; j++) {
            		map[i][j] = str[j];
            		if(map[i][j].equals("<") || map[i][j].equals("^") || map[i][j].equals(">") || map[i][j].equals("v")) {
            			startx = i;
            			starty = j;
            		}
            	}
            }
            
            int k = Integer.parseInt(br.readLine());
            String[] commands = br.readLine().split("");
            
            for(int i = 0; i<k; i++) {
            	game(startx, starty, commands[i]);
            }
            StringBuilder sb = new StringBuilder();
            sb.append("#" + t + " ");
            
            for(int i = 0; i<n; i++) {
            	for(int j = 0; j<m; j++) {
            		sb.append(map[i][j]);
            	}
            	sb.append("\n");
            }
            bw.write(sb.toString());
        }
        bw.flush();
    }
    public static void game(int x, int y, String command) {
    	// 포탄 발사라면
    	if(command.equals("S")) {
    		// 보는 방향으로 포탄을 발사해야함
    		shoot(x,y);
    	}
    	// 움직이는 명령이라면
    	else if(command.equals("U")) {
    		map[x][y] = "^";
    		int nextx = x-1;
    		if(nextx >= 0 && map[nextx][y].equals(".")) {
    			map[nextx][y] = map[x][y];
    			map[x][y] = ".";
    			startx = nextx; starty = y;
    		}
    		
    	}
    	else if(command.equals("D")) {
    		map[x][y] = "v";
    		int nextx = x+1;
    		if(nextx <= n-1 && map[nextx][y].equals(".")) {
    			map[nextx][y] = map[x][y];
    			map[x][y] = ".";
    			startx = nextx; starty = y;
    		}
    		
    	}
    	else if(command.equals("L")) {
    		map[x][y] = "<";
    		int nexty = y-1;
    		if(nexty >= 0 && map[x][nexty].equals(".")) {
    			map[x][nexty] = map[x][y];
    			map[x][y] = ".";
    			startx = x; starty = nexty;
    		}
    		
    	}
    	else if(command.equals("R")) {
    		map[x][y] = ">";
    		int nexty = y+1;
    		if(nexty <= m-1 && map[x][nexty].equals(".")) {
    			map[x][nexty] = map[x][y];
    			map[x][y] = ".";
    			startx = x; starty = nexty;
    		}
    		
    	}
    }
    public static void shoot(int x, int y) {
    	// 왼쪽을 보고 있었다면
    	if(map[x][y].equals("<")) {
    		// 포탄은 왼쪽으로 맵을 벗어날때까지 진행
    		while(y-1 >= 0) {
    			y--;
    			// 중간에 벽돌을 만났다면
    			if(map[x][y].equals("*")) {
    				map[x][y] = ".";
    				return;
    			} // 강철을 만났다면
    			else if(map[x][y].equals("#"))
    				return;
    		}
    	}
    	// 위쪽을 보고 있었다면
    	else if(map[x][y].equals("^")) {
    		// 포탄은 위로 맵을 벗어날때까지 진행
    		while(x-1 >= 0) {
    			x--;
    			// 중간에 벽돌을 만났다면
    			if(map[x][y].equals("*")) {
    				map[x][y] = ".";
    				return;
    			} // 강철을 만났다면
    			else if(map[x][y].equals("#"))
    				return;
    		}
    	}
    	// 오른쪽을 보고 있었다면
    	else if(map[x][y].equals(">")) {
    		// 포탄은 오른쪽으로 맵을 벗어날때까지 진행
    		while(y+1 <= m-1) {
    			y++;
    			// 중간에 벽돌을 만났다면
    			if(map[x][y].equals("*")) {
    				map[x][y] = ".";
    				return;
    			} // 강철을 만났다면
    			else if(map[x][y].equals("#"))
    				return;
    		}
    	}
    	// 아래를 보고 있었다면
    	else if(map[x][y].equals("v")) {
    		// 포탄은 아래로 맵을 벗어날때까지 진행
    		while(x+1 <= n-1) {
    			x++;
    			// 중간에 벽돌을 만났다면
    			if(map[x][y].equals("*")) {
    				map[x][y] = ".";
    				return;
    			} // 강철을 만났다면
    			else if(map[x][y].equals("#"))
    				return;
    		}
    	}
    }
}
728x90
반응형