본문 바로가기

Algorithm

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

(설명 오늘내로 업로드 예정입니다!!)

처음 문제를 읽고 잘못 이해해서 엄청 헤맸다ㅠㅠ

첫번째로 헤맨 부분은 방향 명령어가 들어온다면 이동하거나 이동할수없을때(벽돌벽이던 강철벽이든 물이든) 모두 방향전환을 먼저 처리해줘야하는걸 놓쳤다.

두번째로는 전차와 포탄의 좌표는 별개의 값이므로 각각 처리해줘야한다. 만약 포탄을 발사했는데 계속해서 평지이면 포탄을 계속 이동시킨다. 

 

문제를 처음 읽었을땐 풀만한데?ㅎㅎ 이러고 풀었다가 정말 정말 반성했다. 이렇게 잘못짜버린 코드를 쉽게 버릴수도없고 테스트 케이스도 99개?중에 80개가 맞게 나와서 더욱 힘들었다. (결국 같은반 알고리즘 스터디 조원으로부터 방향처리가 잘못됐다는 지적을 받아 풀수있었다^-ㅠ 고마워 우재!! )

 

지난주부터 알고리즘 보충수업을 들으면서 교수님께서 코드를 바로 구현하지말고 항상 어떻게 풀것인지 상세하게 아이디어를 적어놓으라고해서 계속해서 실천중에 있다. 지금은 많이 틀려도 나중엔 다 맞출꺼다!!! 계속 연습해나가자!!! 

 

package com.ssafy.off;

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

public class SWEA_1873_BattleField {
	//전차는 단 하나
	//포탄 발사하면 벽에 충돌하거나 게임 맵 밖으로 나갈때까지 직진한다. -> 게임 맵 밖으로 포탄이 나가면 아무일도없음.
	//포탄이 벽에 부딪히면 포탄은 사라지고 강철 벽은 그대로 벽돌 벽은 평지로 바뀐다.
	//변화된 맵 상태 출력
	static char[][] map;
	static char[] input;
	static char[] tank = {'^','v','<','>'};
	static int[] dy = {-1,1,0,0};
	static int[] dx = {0,0,-1,1};
	static HashMap<Character, Integer> order = new HashMap<>();
	
	public static void init() {
		order.put('U', 0);
		order.put('D', 1);
		order.put('L', 2);
		order.put('R', 3);
	}
	//명령어대로 이동
	//map상태 변화
	public static void solve(int y, int x, int dir, char[][] map, char[] input) {//dir : 탱크 초기 방향
		int py,px; //초기 탱크 위치
		int next_dir = dir;
		py = y;
		px = x;
		for (int i = 0; i < input.length; i++) {
			if(input[i] == 'S') {
				//포탄 발사 : 포탄은 사라지고 강철벽(#)은 그대로 벽돌벽(*)은 평지로바뀜
				//벽에부딪힐때 맵밖으로나갈때
				int p_y = py; //포탄 y 위치
				int p_x = px; //포탄 x 위치
				while(true) {
					int ny = p_y + dy[next_dir];//방향이바뀐걸적용시켜야함
					int nx = p_x + dx[next_dir];
					if(ny >= 0 && ny < map.length && nx >= 0 && nx < map[0].length) {
						//강철벽에 부딪힐때
						if(map[ny][nx] == '#') {
							break;
						}
						//벽돌벽에 부딪힐때
						else if(map[ny][nx] == '*') {
							map[ny][nx] = '.';//평지로바뀐다.
							break;
						}
						//계속 이동
						else {
							p_y = ny;
							p_x = nx;
						}
					}else {
						//맵밖으로나갈때 맵 변화 없음
						break;
					}
				}
			//방향 명령어일때
			}else {
				//한칸씩만 이동
				int ny = py + dy[order.get(input[i])];
				int nx = px + dx[order.get(input[i])];
				next_dir = order.get(input[i]);
				map[py][px] = tank[next_dir]; //다음좌표에 탱크 방향 변경 적용
				if(ny >= 0 && ny < map.length && nx >= 0 && nx < map[0].length) {
					if(map[ny][nx] == '.') {
						map[py][px] = '.'; //원래위치평지로바꿈
						map[ny][nx] = tank[next_dir];
						py = ny;
						px = nx;
					}
				}
				
			}

			
		}
	}
	
	
	public static void main(String[] args) throws IOException {
		BufferedReader in = new BufferedReader(new InputStreamReader(System.in));
		int tc = Integer.parseInt(in.readLine());
		
		for (int t = 1; t <= tc; t++) {
			//입력
			StringTokenizer st = new StringTokenizer(in.readLine());
			int row = Integer.parseInt(st.nextToken());
			int col = Integer.parseInt(st.nextToken());
			
			int startY=0,startX=0;
			int dir = -1;
			
			map = new char[row][col];
			for (int i = 0; i < row; i++) {
				String line = in.readLine();
				for (int j = 0; j < col; j++) {
					map[i][j] = line.charAt(j);
					if(map[i][j] == '^' || map[i][j] == 'v' || map[i][j] == '<' || map[i][j] == '>') {
						startY = i;
						startX = j;
						for (int k = 0; k < 4; k++) {
							if(tank[k] == map[i][j])
								dir = k;
						}
					}
				}
			}
			int size = Integer.parseInt(in.readLine());

			input = in.readLine().toCharArray();
			
			init();
			
			solve(startY, startX, dir, map, input);
			System.out.print("#"+t+ " ");
			for (int i = 0; i < row; i++) {
				for (int j = 0; j < col; j++) {
					System.out.print(map[i][j]);
				}
				System.out.println();
			}
			

		}
		
	}

}

 

 

'Algorithm' 카테고리의 다른 글

[SWEA] JAVA - 3499 퍼펙트 셔플  (0) 2021.02.06
[SWEA] JAVA - 1210 Ladder1  (0) 2021.02.06
[SWEA] JAVA - 1223 계산기2  (0) 2021.02.05
[SWEA] JAVA - 1225 암호생성기  (1) 2021.02.05
[SWEA] JAVA - 1218 괄호 짝짓기  (0) 2021.02.05