사용한 알고리즘 및 자료구조
DFS/BFS, 그래프
풀이
간단한 DFS/BFS 문제이다. 문제를 푸는데 20분도 안 걸렸다. 이번에는 DFS를 이용해서 해당 문제를 풀었다. 이 문제를 읽고 생각을 했던 것은 2차원 배열에서 (n,n) 칸들을 기준으로 좌우 대칭이 된다는 것이다. 또한 각각의 값들이 연결관계를 표현했다. 따라서 처음에 탐색할 때는 1/2만 탐색을 하고 DFS 를 사용할 때는 연결관계를 기준으로 탐색을 하면 된다. 보통의 DFS 문제는 ‘상하좌우’로 움직이면서 문제를 해결했지만, 해당 문제는 배열의 값들이 내포하고 있는 연결관계를 이용해서 DFS 함수를 구현했다.
- 초기화
- 문제에 해당하는 조건( 배열의 값 : 1 && 아직 탐색하지 않은 칸) 찾기 ,조건을 찾을 때 마다 answer++
- 조건 찾고 나서 DFS 함수를 이용해 연결관계를 따라 영역표시하기
- 다시 2-3번 반복
- Answer 출력
간단한 DFS 문제이다. 실제로 삼성 시험을 봤던 사람들에게는 매우 쉬웠을 거라 생각한다. 다만 이것을 어떻게 해야 더 효율적으로 구현할 수 있을까 고민해보았다. 간단한 문제라 특별하게 적용할 것은 없었으나, 그래도 고민 해보면 좋을 것이다.
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 | public static int SIZE; // before test, have to delete 'static' keywords public static int solution(int n, int[][] computers) { int answer = 0; boolean[][] visited = new boolean[n][n]; SIZE = n; for (int c_idx = 0; c_idx < n; c_idx++) for (int r_idx = c_idx; r_idx < n; r_idx++) { if ((computers[c_idx][r_idx] == 1) && (visited[c_idx][r_idx] == false)) { visited[c_idx][r_idx] = true; dfs(r_idx, visited, computers); answer++; } } return answer; } public static void dfs(int idx, boolean[][] visited, int[][] computers) { for (int col = 0; col < SIZE; col++) { if ((computers[idx][col] == 1) && (visited[idx][col] == false)) { visited[idx][col] = true; dfs(col, visited, computers); } } } | cs |
'알고리즘(추가예정) > 동적계획법' 카테고리의 다른 글
[프로그래머스] 124 나라의 숫자 (0) | 2020.08.30 |
---|---|
[프로그래머스] 2n 타일링 (0) | 2020.08.23 |
백준 2315 가로등 끄기 (0) | 2017.11.16 |
백준 1563 개근상 (0) | 2017.11.14 |
백준 1495 기타리스트 (0) | 2017.11.13 |