티스토리 뷰
1. N X N의 Map에서, 가능성이 있는 조합을 모두 찾는다. 예를 들어, 4 X 4의 2차원 배열에서 탐색할 수 있는 칸의 조합은 왼쪽아래, 오른쪽아래, 오른쪽위, 왼쪽위 순서로 탐색했을 때 다음과 같다.
1) 왼쪽아래 2칸 // 오른쪽아래 1칸 // 오른쪽위 2칸 // 왼쪽위 1칸
2) 왼쪽아래 1칸 // 오른쪽아래 2칸 // 오른쪽위 1칸 // 왼쪽위 2칸
3) 왼쪽아래 1칸 // 오른쪽아래 1칸 // 오른쪽위 1칸 // 왼쪽위 1칸
2. 4 X 4 2차원 배열의 어느 지점에서, 1번에서 구했던 각 방향마다의 이동칸수가 가능하다면, 탐색을 시작한다.
탐색할 때에는 디저트의 종류는 1부터 100이므로 boolean형 배열을 선언해서 확인한다.
[소스 코드]
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 | import java.io.BufferedReader; import java.io.IOException; import java.io.InputStreamReader; import java.util.ArrayList; import java.util.Arrays; import java.util.Collection; import java.util.Collections; import java.util.Comparator; import java.util.LinkedList; import java.util.List; import java.util.Queue; import java.util.Stack; import java.util.StringTokenizer; public class Solution { public static int N, tCase, leftDown, rightDown, ans = 0; public static int[][] map; public static int[] dirX = new int[] { 1, 1, -1, -1 }; public static int[] dirY = new int[] { -1, 1, 1, -1 }; 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][N]; ans = -1; for (int i = 0; i < N; i++) { st = new StringTokenizer(br.readLine()); for (int j = 0; j < N; j++) { map[i][j] = Integer.parseInt(st.nextToken()); } } for (int row = 0; row < N; row++) { for (int col = 0; col < N; col++) { for (int i = N - 2; i >= 1; i--) { for (int j = N - i - 1; j >= 1; j--) { leftDown = i; rightDown = j; solve(row, col, new boolean[101]); } } } } System.out.println("#" + t + " " + ans); } } public static void solve(int row, int col, boolean[] visited) { if (!isPossible(row, col)) return; int nr = row; int nc = col; for (int i = 0; i < 4; i++) { // 왼쪽아래, 오른쪽위 if (i == 0 || i == 2) { for (int j = 1; j <= leftDown; j++) { nr = nr + dirX[i]; nc = nc + dirY[i]; if (!visited[map[nr][nc]]) { visited[map[nr][nc]] = true; } else return; } } else { // 오른쪽 아래, 왼쪽위 for (int j = 1; j <= rightDown; j++) { nr = nr + dirX[i]; nc = nc + dirY[i]; if (!visited[map[nr][nc]]) { visited[map[nr][nc]] = true; } else return; } } } ans = Math.max(ans, rightDown * 2 + leftDown * 2); } public static boolean isPossible(int row, int col) { int nr = row; int nc = col; nr = nr + dirX[0] * leftDown; nc = nc + dirY[0] * leftDown; if (!isBoundary(nr, nc)) return false; nr = nr + dirX[1] * rightDown; nc = nc + dirY[1] * rightDown; if (!isBoundary(nr, nc)) return false; nr = nr + dirX[2] * leftDown; nc = nc + dirY[2] * leftDown; if (!isBoundary(nr, nc)) return false; nr = nr + dirX[3] * rightDown; nc = nc + dirY[3] * rightDown; if (!isBoundary(nr, nc)) return false; return true; } public static boolean isBoundary(int row, int col) { return (row >= 0 && row < N) && (col >= 0 && col < N); } public static void showMap(int[][] map) { for (int i = 0; i < N; i++) { for (int j = 0; j < N; j++) { System.out.print(map[i][j] + " "); } System.out.println(); } System.out.println(); } } | cs |
'알고리즘 문제 > SW Expert Academy' 카테고리의 다른 글
[SWEA 5648번] 원자소멸 시뮬레이션 :: 늦깎이 IT (1) | 2019.03.20 |
---|---|
[SWEA 5644번] 무선충전 :: 늦깎이 IT (0) | 2019.03.17 |
[SWEA 5650번] 핀볼 게임 :: 늦깎이 IT (0) | 2019.03.16 |
[SWEA 2112번] 보호 필름 :: 늦깎이 IT (0) | 2019.03.13 |
[SWEA 1949번] 등산로 조성 :: 늦깎이 IT (0) | 2019.03.13 |
댓글
공지사항
최근에 올라온 글
최근에 달린 댓글
- Total
- Today
- Yesterday
TAG
- 자바
- 리스트
- BFS
- 중간값
- 트리
- 연산자 끼워넣기
- 알고스팟
- 최소힙
- 14888
- 알고리즘
- 시뮬레이션
- 삼성
- 나무 재테크
- 정렬
- 탈주범 검거
- 우선순위 큐
- SWEA
- 백준
- 힙
- 힙정렬
- 탐색
- DFS
- 구슬 탈출2
- 배열
- 영역 구하기
- 최대힙
- 브루트포스
- 구현
- 큐
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
글 보관함