티스토리 뷰
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<0) return; if(arr[x][y-1]=='.') { arr[x][y--] = '.'; arr[x][y] = '<'; } } private static void up() { dir = UP; arr[x][y] = '^'; if(x-1<0) return; 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 |
'알고리즘 > SW Expert' 카테고리의 다른 글
[SW Expert] 1952. [모의 SW 역량테스트] 수영장 (0) | 2018.08.31 |
---|---|
[SW Expert] 4008. [모의 SW 역량테스트] 숫자 만들기 (0) | 2018.08.31 |
[SW Expert] 1218. [S/W 문제해결 기본] 4일차 - 괄호 짝짓기 (0) | 2018.08.30 |
[SW Expert] 1227. [S/W 문제해결 기본] 7일차 - 미로2 (0) | 2018.08.29 |
[SW Expert] 1226. [S/W 문제해결 기본] 7일차 - 미로1 (0) | 2018.08.29 |
댓글
공지사항
최근에 올라온 글
최근에 달린 댓글
- Total
- Today
- Yesterday