ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [JAVA] SW EXPERT 1873 상호의 배틀필드
    코팅테스트 연습/자바 2022. 2. 6. 21:15

    문제링크 :

    https://swexpertacademy.com/main/code/problem/problemDetail.do?contestProbId=AV5LyE7KD2ADFAXc&categoryId=AV5LyE7KD2ADFAXc&categoryType=CODE&problemTitle=%EC%83%81%ED%98%B8%EC%9D%98+%EB%B0%B0%ED%8B%80%ED%95%84%EB%93%9C&orderBy=FIRST_REG_DATETIME&selectCodeLang=ALL&select-1=&pageSize=10&pageIndex=1

     

     

    문제풀이 :

    문제는 세 부분으로 나누어서 생각하였습니다. 

     

    탱크의 명령어를 작동시키는 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, -10); // 위를 보고있을때 즉 탱크포탄의 가중치가 세로로 -1일때
     
                    } else if (tank[ide[0]][ide[1]].equals("v")) {
                        shot(tank, 10);// 아래를 보고 있을일때 즉 탱크포탄의 가중치가 세로로 1일때
                    } else if (tank[ide[0]][ide[1]].equals("<")) {
                        shot(tank, 0-1);    //왼쪽을 보고 있을때 즉 탱크포탄의 가중치가 가로로 -1일때
     
                    } else if (tank[ide[0]][ide[1]].equals(">")) {
                        shot(tank, 01);  //오른쪽 을 보고 있을때 즉 탱크포탄의 가중치가 가로로 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

    댓글

Designed by Tistory.