코팅테스트 연습/자바
[JAVA] SW EXPERT 1873 상호의 배틀필드
COOLER
2022. 2. 6. 21:15
문제링크 :
문제풀이 :
문제는 세 부분으로 나누어서 생각하였습니다.
탱크의 명령어를 작동시키는 CHANGE 함수
탱크의 현재 위치를 반환하는 FIND 함수
탱크가 포탄을 발사했을 때 사용하는 SHOT 함수
CHANGE 함수는
인자로 현재 맵을 나타내는 String [] [] 인 tank 와 명령어인 move 를 가지고 있습니다
change 함수 내에서 find 함수를 이용해 탱크의 위치를 찾아내고 move 에 길이 만큼 for 문을 이용해 명령어를 처리합니다.
if 문을 통해 명령어 별로 처리를 달리 하였고 , 만약 명령어를 통해 탱크가 움직일 수 있는 조건을 만족하면 [][]tank 의 현재 탱크의 위치를 변경하였습니다
또 한 S 명령어(포탄발사) 인경우에는 위에서 설명한 SHOT 함수에 탱크의 방향에 따른 가로세로 가중치를 주어 들어갈 수 있도록 처리했습니다
FIND 함수는
인자로 현재 맵을 나타내는 String [] [] 인 tank 을 가지고 잇습니다
현재 탱크의 위치를 for 문을 통해 배열을 탐색하며 int [][] index 를 통해 반환합니다
SHOT 함수
인자로 현재 맵을 나타내는 String [] [] 인 tank 와 세로 가로 가중치를 나타내는 int i 와 j 를가지고있습니다
while(true) 을 돌며
가중치만큼 포탄을 이동시키며 포탄이 벽에 맞아 없어지거나 , 맵밖으로 나갈때까지 while 을 진행시킵니다.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
|
import java.util.Scanner;
public class swe_1873 {
public static int[] find(String[][] tank) { //현재 배열에서 탱크를 찾아서 index [][] 배열을 리턴하는 함수
int index[] = new int[2];
index[0] = -1;
for (int i = 0; i < tank.length; i++) {
for (int j = 0; j < tank[0].length; j++) {
if (tank[i][j].equals("^") || tank[i][j].equals("v") || tank[i][j].equals("<") //탱크를 찾았을때
|| tank[i][j].equals(">")) {
index[0] = i; //배열의 세로
index[1] = j; //배열의가로
break;
}
}
}
return index;
}
public static void shot(String[][] tank, int i, int j) { //발사했을때 사용하는 함수
int[] ide = find(tank);
int i_i = ide[0];
int j_j = ide[1]; //탱크를 찾아서 인덱스를 받아옴
while (true) {
i_i = i_i + i; //탱크방향에 따라서 i 또는 j 만큼 가중치를 준다
j_j = j_j + j;
if (0 > i_i || i_i >= tank.length || 0 > j_j || j_j >= tank[0].length) { // 포탄이 맵을 벗어난경우
break;
} else {
if (tank[i_i][j_j].equals("*")) {
tank[i_i][j_j] = "."; //포탑이 벽돌에 부딪힌경우 평지로 바꾸고 멈춤
break;
} else if (tank[i_i][j_j].equals("#")) { //포탄이 강철에 부딪힌경우 그냥 브레이크
break;
}
}
}
}
public static void change(String[][] tank, String move) { // 탱크의 명령어를 처리하는 함수
for (int i = 0; i < move.length(); i++) { // 명령어 길이만큼 for문을 돌린다
int ide[] = new int[2];
if (Character.toString(move.charAt(i)).equals("U")) { //U 업 명령어일때
ide = find(tank); // 텡크의 위치를 찾고
if (ide[0] - 1 >= 0 && tank[ide[0] - 1][ide[1]].equals(".")) { // 탱크가 위로 올라가도 맵을 벗어나지 않고 평지일때
tank[ide[0]][ide[1]] = ".";
tank[ide[0] - 1][ide[1]] = "^"; //탱크의 위치를 바꾸고 지나온 자리를 평지처리
} else { // 아닐시
tank[ide[0]][ide[1]] = "^"; // 탱크의 방향만 변경
}
} else if (Character.toString(move.charAt(i)).equals("D")) { //D 다운 명령어 일때 위프로세스와 같다
ide = find(tank);
if (ide[0] + 1 < tank.length && tank[ide[0] + 1][ide[1]].equals(".")) {
tank[ide[0]][ide[1]] = ".";
tank[ide[0] + 1][ide[1]] = "v";
} else {
tank[ide[0]][ide[1]] = "v";
}
} else if (Character.toString(move.charAt(i)).equals("L")) { //L 레프트 명령어 일때 위프로세스와 같다
ide = find(tank);
if (ide[1] - 1 >= 0 && tank[ide[0]][ide[1] - 1].equals(".")) {
tank[ide[0]][ide[1]] = ".";
tank[ide[0]][ide[1] - 1] = "<";
} else {
tank[ide[0]][ide[1]] = "<";
}
} else if (Character.toString(move.charAt(i)).equals("R")) { //R 라이트 명령어 일때 위프로세스와 같다
ide = find(tank);
if (ide[1] + 1 < tank[0].length && tank[ide[0]][ide[1] + 1].equals(".")) {
tank[ide[0]][ide[1]] = ".";
tank[ide[0]][ide[1] + 1] = ">";
} else {
tank[ide[0]][ide[1]] = ">";
}
} else if (Character.toString(move.charAt(i)).equals("S")) { // 포탄을 발사할때
ide = find(tank); // 탱크의 위치를 찾아서 if 문을 통해 탱크의 방향에 따라 나눔
if (tank[ide[0]][ide[1]].equals("^")) {
shot(tank, -1, 0); // 위를 보고있을때 즉 탱크포탄의 가중치가 세로로 -1일때
} else if (tank[ide[0]][ide[1]].equals("v")) {
shot(tank, 1, 0);// 아래를 보고 있을일때 즉 탱크포탄의 가중치가 세로로 1일때
} else if (tank[ide[0]][ide[1]].equals("<")) {
shot(tank, 0, -1); //왼쪽을 보고 있을때 즉 탱크포탄의 가중치가 가로로 -1일때
} else if (tank[ide[0]][ide[1]].equals(">")) {
shot(tank, 0, 1); //오른쪽 을 보고 있을때 즉 탱크포탄의 가중치가 가로로 1일때
}
}
}
}
public static void main(String args[]) throws Exception {
Scanner sc = new Scanner(System.in);
int T;
T = Integer.parseInt(sc.nextLine());
for (int test_case = 1; test_case <= T; test_case++) { // 스캐너를 이용해 테스트 케이스만큼 입력
int heigt = sc.nextInt();
int width = sc.nextInt();
sc.nextLine();
String[][] tank = new String[heigt][width];
for (int i = 0; i < heigt; i++) {
String temp = sc.nextLine();
for (int j = 0; j < width; j++) { //한줄씩받아서 배열에 저장
tank[i][j] = Character.toString(temp.charAt(j));
}
}
sc.nextLine();
String move = sc.nextLine(); //명령어를 받는 부분
change(tank, move); // 명령어 처리
System.out.printf("#%d ", test_case);
for (int i = 0; i < heigt; i++) { //배열출력
for (int j = 0; j < width; j++) {
System.out.print(tank[i][j]);
}
System.out.println();
}
}
}
}
|
cs |