티스토리 뷰
[SWEA 2112. [모의 SW 역량테스트] 보호 필름 URL]
1. 총 3가지의 경우를 생각할 수 있다.
1) 현재 행을 그대로 두는 경우
2) 현재 행에 A약을 투입하는 경우
3) 현재 행에 B약을 투입하는 경우
2. 위의 세 가지 경우를 생각하며 DFS 탐색을 진행한다.
DFS 매개변수로는, 이전 필름의 상태(prev), 시약을 투입한 횟수(numOfInject), 필름의 두께(depth)이다.
현재 행을 그대로 두는 경우에는 numOfInject의 수는 변함이 없고, 현재 행에 약을 투입하는 경우에만 1을 증가
시켜 DFS탐색을 진행한다. 현재 행(depth)에 시약을 투입할 경우 필름의 상태를 변경한 뒤, DFS의 매개변수로
넘겨준다.
3. 성능검사 통과
isPossible() 메소드를 참고하기 바란다.
[소스 코드]
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 | import java.io.BufferedReader; import java.io.IOException; import java.io.InputStreamReader; import java.util.ArrayList; import java.util.Arrays; import java.util.Collections; import java.util.LinkedList; import java.util.List; import java.util.Queue; import java.util.Scanner; import java.util.Stack; import java.util.StringTokenizer; import java.util.concurrent.LinkedBlockingDeque; public class Solution { public static int D, W, K, tCase, ans; public static int[][] map; 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 NumberFormatException, IOException { tCase = Integer.parseInt(br.readLine()); for (int t = 1; t <= tCase; t++) { StringTokenizer st = new StringTokenizer(br.readLine()); D = Integer.parseInt(st.nextToken()); W = Integer.parseInt(st.nextToken()); K = Integer.parseInt(st.nextToken()); ans = Integer.MAX_VALUE; map = new int[D][W]; for (int i = 0; i < D; i++) { st = new StringTokenizer(br.readLine()); for (int j = 0; j < W; j++) { map[i][j] = Integer.parseInt(st.nextToken()); } } dfs(map, 0, 0); System.out.println("#" + t + " " + ans); } } public static void dfs(int[][] prev, int numOfInject, int depth) { if (numOfInject >= ans) return; if (depth >= D) { if (isPossible(prev)) { ans = Math.min(ans, numOfInject); } return; } int[][] temp = new int[D][W]; for (int i = 0; i < D; i++) temp[i] = Arrays.copyOf(prev[i], prev[i].length); dfs(temp, numOfInject, depth + 1); Arrays.fill(temp[depth], 0); dfs(temp, numOfInject + 1, depth + 1); Arrays.fill(temp[depth], 1); dfs(temp, numOfInject + 1, depth + 1); } public static boolean isPossible(int[][] map) { for (int j = 0; j < W; j++) { boolean flag = false; for (int i = 0; i <= D - K; i++) { flag = true; for (int k = 1; k < K; k++) { if (map[i][j] != map[i + k][j]) { flag = false; break; } } if (flag) break; } if (!flag) return false; } return true; } public static boolean isBoundary(int row, int col) { return (row >= 0 && row < D) && (col >= 0 && col < W); } public static void showMap(int[][] map) { for (int i = 0; i < D; i++) { for (int j = 0; j < W; j++) { System.out.print(map[i][j] + " "); } System.out.println(); } System.out.println(); } } | cs |
'알고리즘 문제 > SW Expert Academy' 카테고리의 다른 글
[SWEA 5644번] 무선충전 :: 늦깎이 IT (0) | 2019.03.17 |
---|---|
[SWEA 5650번] 핀볼 게임 :: 늦깎이 IT (0) | 2019.03.16 |
[SWEA 1949번] 등산로 조성 :: 늦깎이 IT (0) | 2019.03.13 |
[SWEA 1953번] 탈주범 검거 :: 늦깎이 IT (0) | 2019.03.13 |
[SWEA 4012번] 요리사 :: 늦깎이 IT (0) | 2019.03.12 |
댓글
공지사항
최근에 올라온 글
최근에 달린 댓글
- Total
- Today
- Yesterday
TAG
- 배열
- 알고스팟
- 정렬
- DFS
- 중간값
- 브루트포스
- 자바
- 큐
- 시뮬레이션
- 최소힙
- 우선순위 큐
- SWEA
- 최대힙
- 구현
- 탈주범 검거
- 구슬 탈출2
- 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 |
글 보관함