티스토리 뷰
[5650. [모의 SW 역량테스트] 핀볼 게임 URL]
1. 입력으로 주어지는 N X N 핀볼 게임판에서, 빈공간에서 4방향 (동, 서, 남, 북)으로 공을 굴려가며 최대 값을
찾는다.
2. 이 문제에서 탐색 중단 조건은 블랙홀(-1)을 만났거나, 처음 시작 위치로 되돌아오는 경우이다.
3. N X N의 핀볼 게임판의 가장자리는 "벽"이라고 가정한다. 즉, N이 아닌 N+2만큼의 2차원배열을 선언하고
가장자리에 "5" 짜리 블럭을 세운다.
4. 공을 굴리는 도중, 블럭을 만났다면 방향을 바꿔주고, 웜홀을 만났다면 다른 웜홀 위치로 이동시킨다.
[전체 소스코드]
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 146 147 148 149 150 151 152 153 154 155 | import java.io.BufferedReader; import java.io.InputStreamReader; import java.util.ArrayList; import java.util.Arrays; import java.util.Comparator; import java.util.LinkedList; import java.util.List; import java.util.PriorityQueue; import java.util.Queue; import java.util.StringTokenizer; public class Solution { public static int tCase, N, ans; public static int[][] map; public static int[][][] holes; public static boolean[][] visited; public static int[] dirX = new int[] { 0, 0, 1, -1 }; // 동 서 남 북 public static int[] dirY = new int[] { 1, -1, 0, 0 }; public static BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); public static void main(String[] args) throws Exception { StringTokenizer st = new StringTokenizer(br.readLine()); tCase = Integer.parseInt(st.nextToken()); for (int t = 1; t <= tCase; t++) { st = new StringTokenizer(br.readLine()); N = Integer.parseInt(st.nextToken()); map = new int[N + 2][N + 2]; holes = new int[5][2][2]; boolean isExistHole[] = new boolean[5]; ans = 0; for (int i = 0; i < N + 2; i++) map[i][0] = map[i][N + 1] = map[0][i] = map[N + 1][i] = 5; for (int i = 1; i <= N; i++) { st = new StringTokenizer(br.readLine()); for (int j = 1; j <= N; j++) { map[i][j] = Integer.parseInt(st.nextToken()); if (map[i][j] >= 6 && map[i][j] <= 10) { int hole = map[i][j] - 6; if (!isExistHole[hole]) { isExistHole[hole] = true; holes[hole][0][0] = i; holes[hole][0][1] = j; } else { holes[hole][1][0] = i; holes[hole][1][1] = j; } } } } for (int i = 1; i <= N; i++) { for (int j = 1; j <= N; j++) { for (int dir = 0; dir < 4; dir++) if (map[i][j] == 0) bfs(i, j, dir); } } System.out.println("#" + t + " " + ans); } } public static void bfs(int startRow, int startCol, int startDir) { int row = startRow; int col = startCol; int dir = startDir; int score = 0; while (true) { row += dirX[dir]; col += dirY[dir]; if ((row == startRow && col == startCol) || map[row][col] == -1) { ans = Math.max(ans, score); break; } if (map[row][col] >= 1 && map[row][col] <= 5) { dir = getDirection(dir, map[row][col]); score += 1; } else if (map[row][col] >= 6 && map[row][col] <= 10) { int hole = map[row][col] - 6; if (holes[hole][0][0] == row && holes[hole][0][1] == col) { row = holes[hole][1][0]; col = holes[hole][1][1]; } else { row = holes[hole][0][0]; col = holes[hole][0][1]; } } } } public static int getDirection(int dir, int wall) { if (dir == 0) { if (wall == 1 || wall == 2 || wall == 5) return 1; else if (wall == 3) { return 2; } else { return 3; } } else if (dir == 1) { if (wall == 3 || wall == 4 || wall == 5) return 0; else if (wall == 1) { return 3; } else { return 2; } } else if (dir == 2) { if (wall == 2 || wall == 3 || wall == 5) return 3; else if (wall == 1) { return 0; } else { return 1; } } else { if (wall == 1 || wall == 4 || wall == 5) return 2; else if (wall == 2) { return 0; } else { return 1; } } } public static boolean isBoundary(int row, int col) { return (row >= 0 && row < N + 2) && (col >= 0 && col < N + 2); } } | cs |
'알고리즘 문제 > SW Expert Academy' 카테고리의 다른 글
[SWEA 2105번] 디저트 카페 :: 늦깎이 IT (0) | 2019.03.17 |
---|---|
[SWEA 5644번] 무선충전 :: 늦깎이 IT (0) | 2019.03.17 |
[SWEA 2112번] 보호 필름 :: 늦깎이 IT (0) | 2019.03.13 |
[SWEA 1949번] 등산로 조성 :: 늦깎이 IT (0) | 2019.03.13 |
[SWEA 1953번] 탈주범 검거 :: 늦깎이 IT (0) | 2019.03.13 |
댓글
공지사항
최근에 올라온 글
최근에 달린 댓글
- Total
- Today
- Yesterday
TAG
- 구슬 탈출2
- 탐색
- 백준
- 나무 재테크
- 정렬
- 중간값
- 자바
- 알고리즘
- 삼성
- 알고스팟
- 큐
- SWEA
- 최소힙
- 배열
- DFS
- 힙
- 최대힙
- 브루트포스
- 연산자 끼워넣기
- 탈주범 검거
- 구현
- 트리
- 14888
- 우선순위 큐
- 영역 구하기
- 리스트
- 힙정렬
- BFS
- 시뮬레이션
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
글 보관함