그래프 관련 문제들의 유형이 다 비슷비슷 한 것 같아보인다.
확실히 짚고 넘어가야 할 필요를 느꼈다.
물론 돌아서면 까먹어서 문제..
최대한 main 부분은 건드리지 않고 DFS, BFS
부분만 바꿔서 정리 하려고 노력했다.
DFS 문제 풀이
public class ApartNumberingDfs {
private static int dx[] = {0,0,1,-1};
private static int dy[] = {1,-1,0,0};
private static int[] aparts = new int[25*25];
private static int n;
private static int apartNum = 0; //아파트 단지 번호의 수
private static boolean[][] visited = new boolean[25][25]; //방문여부
private static int[][] map = new int[25][25]; //지도
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
n = sc.nextInt();
map = new int[n][n];
visited = new boolean[n][n];
//전체 사각형 입력 받기
for(int i=0; i<n; i++){
String input = sc.next();
for(int j=0; j<n; j++){
map[i][j] = input.charAt(j)-'0';
}
}
for(int i=0; i<n; i++){
for(int j=0; j<n; j++){
if(map[i][j] == 1 && !visited[i][j]){
apartNum++;
dfs(i,j);
}
}
}
Arrays.sort(aparts);
System.out.println(apartNum);
for(int i=0; i<aparts.length; i++){
if(aparts[i] == 0){
}else{
System.out.println(aparts[i]);
}
}
}
private static void dfs(int x, int y) {
visited[x][y] = true;
aparts[apartNum]++;
for(int i=0; i<4; i++){
int nx = x + dx[i];
int ny = y + dy[i];
if(nx >=0 && ny >=0 && nx < n && ny < n){
if(map[nx][ny] == 1 && !visited[nx][ny]){
dfs(nx,ny);
}
}
}
}
}
BFS 문제 풀이
public class ApartNumberingBfs {
private static int dx[] = {0,0,1,-1};
private static int dy[] = {1,-1,0,0};
private static int[] aparts = new int[25*25];
private static int n;
private static int apartNum = 0; //아파트 단지 번호의 수
private static boolean[][] visited = new boolean[25][25]; //방문여부
private static int[][] map = new int[25][25]; //지도
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
n = sc.nextInt();
map = new int[n][n];
visited = new boolean[n][n];
//전체 사각형 입력 받기
for(int i=0; i<n; i++){
String input = sc.next();
for(int j=0; j<n; j++){
map[i][j] = input.charAt(j)-'0';
}
}
for(int i=0; i<n; i++){
for(int j=0; j<n; j++){
if(map[i][j] == 1 && !visited[i][j]){
apartNum++;
bfs(i,j);
}
}
}
Arrays.sort(aparts);
System.out.println(apartNum);
for(int i=0; i<aparts.length; i++){
if(aparts[i] == 0){
}else{
System.out.println(aparts[i]);
}
}
}
private static void bfs(int x, int y) {
//2차원 LinkedList를 가진 큐 선언
Queue<int[]> que = new LinkedList<>();
que.add(new int[]{x,y});
visited[x][y] = true;
aparts[apartNum]++;
while(!que.isEmpty()){
//x, y 값을 받아오기 위한 방법
int curX = que.peek()[0];
int curY = que.peek()[1];
que.poll();
for(int i=0; i<4; i++){
int nx = curX + dx[i];
int ny = curY + dy[i];
if(nx >= 0 && ny >= 0 && nx < n && ny < n){
if(map[nx][ny] == 1 && !visited[nx][ny]){
que.add(new int[]{nx,ny});
visited[nx][ny] = true;
aparts[apartNum]++;
}
}
}
}
}
}
'알고리즘 > 백준' 카테고리의 다른 글
[백준] 7569번 토마토 (2) | 2018.08.27 |
---|---|
[백준] 7576번 토마토 (0) | 2018.08.21 |
[백준] 1260 DFS와 BFS (0) | 2018.08.20 |
백준 2747, 2748 피보나치 수 (0) | 2018.08.06 |
백준 10866번 덱(Deque) (0) | 2018.07.30 |
댓글