-
[JAVA] SW EXPERT 1873 상호의 배틀필드코팅테스트 연습/자바 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 을 진행시킵니다.
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129import 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 '코팅테스트 연습 > 자바' 카테고리의 다른 글
[JAVA] 백준 1182번 부분수열의 합 (재귀 부분집합 사용) (0) 2022.02.26 [JAVA] 백준 2468번 안전영역 (BFS QUEUE 이용) (0) 2022.02.26 [JAVA] 백준 2178 번 미로 탐색 (BFS QUEUE) 활용 (0) 2022.02.26 [JAVA] 백준 16927 배열돌리기 2 (0) 2022.02.13 [JAVA] 백준 2667번 단지번호붙이기 BFS , DFS (0) 2022.02.13