일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
Tags
- 안드로이드 AdapterView
- application not responding
- android fragment
- 소수
- anr
- 자료구조
- DFS
- 너비우선탐색
- 소수 알고리즘
- 알고리즘
- oracle
- 안드로이드
- BFS
- Github
- 안드로이드 ANR
- 안드로이드 파일
- 백준 알고리즘
- android support
- support 라이브러리
- 안드로이드 DBMS
- 컬렉션
- 깊이우선탐색
- 백준
- java
- SQLite와 Realm 차이점
- android adapterview
- db
- 액티비티 ANR
- 자바 컬렉션
- support fragment
Archives
- Today
- Total
밍의 기록들😉
[문제] 단지번호 붙이기 2667번 본문
문제
소스코드
import java.util.Arrays; import java.util.Scanner; public class Dangi { public static final int[] dx = {0,0,1,-1}; public static final int[] dy = {1,-1,0,0}; public static void main(String[] args) { Scanner sc = new Scanner(System.in); int n = sc.nextInt(); sc.nextLine(); int[][] a = new int[n][n]; for(int i=0; i<n; i++){ String s = sc.nextLine(); for(int j=0; j<n; j++){ a[i][j] = s.charAt(j) - '0'; } } int cnt = 0; int[][] group = new int[n][n]; for(int i=0; i<n; i++){ for(int j=0; j<n; j++){ if(a[i][j] == 1 && group[i][j] ==0){ dfs(a, group, i, j, ++cnt, n); } } } int[] ans = new int[cnt]; for(int i=0; i<n; i++){ for(int j=0; j<n; j++){ if(group[i][j] != 0){ ans[group[i][j]-1] = ans[group[i][j]-1]+1; } } } Arrays.sort(ans); System.out.println(cnt); for(int i=0; i<cnt; i++){ System.out.println(ans[i]); } } private static void dfs(int[][] a, int[][] group, int x, int y, int cnt, int n) { group[x][y] = cnt; for(int k=0; k<4; k++){ int nx = x+dx[k]; int ny = y+dy[k]; if(0<= nx && nx < n && 0<=ny && ny<n){ if(a[nx][ny] == 1 & group[nx][ny] == 0) dfs(a, group, nx, ny, cnt, n); } } } }
풀이
크게 3가지 부분으로 나눌 수 있다.
첫 번째, a[]는 그림 1의 단지를 담는 배열을 선언한다. 입력 값을 받아 반복문으로 배열을 담는다.
두 번째, 단지별 호수인 cnt 값을 0으로 선언한다. 그림 2의 단지인 group[] 배열을 선언한다. a 배열에 1인 값(집이 있는 곳)과 group 배열에 0인(집이 없는 곳)을 찾는다. 깊이 우선 탐색(DFS) 방법을 사용하여 dfs 메소드를 통해 단지의 위, 아래, 오른쪽, 왼쪽을 탐색한다. 재귀호출을 통해 이어진 곳을 탐색하여 group[] 배열에 cnt(단지 호수)를 할당한다.
세 번째, 최종 결과를 담을 배열 ans[]를 선언한다. 단지 호수로 ans 배열에 index 값을 할당하여 반복문을 통해 담는다. 그 후 오름차순으로 정렬한다. 마지막으로 출력을 한다 !
'자료구조, 알고리즘 > 문제풀이' 카테고리의 다른 글
[문제] 웜바이러스 2606번 (0) | 2018.09.05 |
---|---|
[문제] 이진 패턴 (0) | 2018.09.04 |
[문제] 자연수의 분할 (4) | 2018.09.04 |
[문제] 분수 합 1735번 (0) | 2018.08.16 |
[문제] 가로수 2485번 (0) | 2018.08.16 |
Comments