728x90
✅ 문제 요약
전차는 상하좌우, 포탄 발사가 가능하며 만약 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
반응형
'코딩테스트' 카테고리의 다른 글
[JAVA-D3] SWEA 1221 - GNS (1) | 2024.05.01 |
---|---|
[JAVA-L2] 프로그래머스 - 올바른 괄호 (1) | 2024.04.28 |
[JAVA-D3] SWEA 6808 - 규영이와 인영이의 카드게임 (0) | 2024.04.24 |
[JAVA-D3] SWEA 1493 - 수의 새로운 연산 (0) | 2024.04.24 |
[D4-JAVA] SWEA 1238 - Contact (1) | 2024.04.19 |