티스토리 뷰

1) 생각

배틀 필드 게임을 개발하려고 한다. 주어진 조건에 맞게 구현하여라.


처음 생각

조건에 맞춰 구현을 하는 시뮬레이션 문제이다. 


다음 생각

기본 적인 구현을 한 뒤, LEFT RIGHT UP DOWN 방향을 알고 있어야 SHOOT을 그 방향으로 할 수 있으므로 Field 선언을 통해 항상 탱크의 방향을 갱신해주었다.


다다음 생각

'Fail'이 떠서 머가 문제인지 찾기 어려웠으나 시뮬레이션은 문제가 답이므로 문제를 더 꼼꼼히 읽어본 결과 SHOOT을 하였을 때, 벽(*)을 만났을 경우 메소드를 종료시키지 않고 있었다.


2) 방안

1) SHOOT을 할 때 방향 변수에 따라서 4개의 조건으로 나뉘고 그 이후를 탐색한다. '#'을 만나면 바로 종료하고 '*'을 만나면 지도 배열을 '.'로 바꿔주고 종료한다.


2) 개인적으로 조건이 4개 이상이면 if문 보다 switch문으로 사용하는 편이 보기 좋은 것 같다.


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
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.StringTokenizer;
  
public class Solution {
    final static int RIGHT=0,LEFT=1,DOWN=2,UP=3;
    static int h,w,x,y,dir;
    static int[][] arr;
    static StringBuilder sb;
    public static void main(String[] args) throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        sb = new StringBuilder();
        int tc = Integer.parseInt(br.readLine());
        for(int i=1;i<=tc;i++) {
            StringTokenizer st = new StringTokenizer(br.readLine());
            h = Integer.parseInt(st.nextToken());
            w = Integer.parseInt(st.nextToken());
            arr = new int[h][w];
            for(int j=0;j<h;j++) {
                String t = br.readLine();
                for(int k=0;k<w;k++) {
                    int temp = t.charAt(k);
                    arr[j][k] = temp;
                    if(temp!='.'&&temp!='*'&&temp!='#'&&temp!='-') {
                        x = j;
                        y = k;
                        if(temp=='<') dir = LEFT;
                        else if(temp=='>') dir = RIGHT;
                        else if(temp=='^') dir = UP;
                        else if(temp=='v') dir = DOWN;
                    }
                }                   
            }
            int n = Integer.parseInt(br.readLine());
            String t = br.readLine();
            for(int j=0;j<n;j++) {
                switch(t.charAt(j)) {
                case 'U':
                    up();
                    break;
                case 'D':
                    down();
                    break;
                case 'L':
                    left();
                    break;
                case 'R':
                    right();
                    break;
                case 'S':
                    shoot();
                    break;
                }
            }
            sb.append("#"+i+" ");
            for(int j=0;j<h;j++) {
                for(int k=0;k<w;k++)
                    sb.append((char)arr[j][k]);
                sb.append("\n");
            }
        }
        System.out.println(sb);
    }
     
    private static void shoot() {
        // *만 제거 가능
        switch(dir) {
        case RIGHT:
            for(int i=y+1;i<w;i++) {
                if(arr[x][i]=='#'return;
                else if(arr[x][i]=='*') {
                    arr[x][i]='.';
                    return;
                }
            }
            break;
        case LEFT:
            for(int i=y-1;i>=0;i--) {
                if(arr[x][i]=='#'return;
                else if(arr[x][i]=='*') {
                    arr[x][i]='.';
                    return;
                }
            }
            break;
        case UP:
            for(int i=x-1;i>=0;i--) {
                if(arr[i][y]=='#'return;
                else if(arr[i][y]=='*') {
                    arr[i][y]='.';
                    return;
                }
            }
            break;
        case DOWN:
            for(int i=x+1;i<h;i++) {
                if(arr[i][y]=='#'return;
                else if(arr[i][y]=='*') {
                    arr[i][y]='.';
                    return;
                }
            }
            break;
        }
    }
    private static void right() {
        dir = RIGHT;
        arr[x][y] = '>';
        if(y+1>=w) return;
        if(arr[x][y+1]=='.') {
            arr[x][y++= '.';
            arr[x][y] = '>';
        }
    }
    private static void left() {
        dir = LEFT;
        arr[x][y] = '<';
        if(y-1<0return;
        if(arr[x][y-1]=='.') {
            arr[x][y--= '.';
            arr[x][y] = '<';
        }
    }
     
    private static void up() {
        dir = UP;
        arr[x][y] = '^';
        if(x-1<0return;
        if(arr[x-1][y]=='.') {
            arr[x--][y] = '.';
            arr[x][y]='^';
        }
    }
     
    private static void down() {
        dir = DOWN;
        arr[x][y] = 'v';
        if(x+1>=h) return;
        if(arr[x+1][y]=='.') {
            arr[x++][y] = '.';
            arr[x][y] = 'v';
        }
    }
}
cs


댓글
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday