본문 바로가기
알고리즘/그래프

[java 백준] 실버 1/2667번 단지번호 붙이기

by Meaning_ 2021. 9. 29.
728x90
반응형

https://www.acmicpc.net/problem/2667

 

2667번: 단지번호붙이기

<그림 1>과 같이 정사각형 모양의 지도가 있다. 1은 집이 있는 곳을, 0은 집이 없는 곳을 나타낸다. 철수는 이 지도를 가지고 연결된 집의 모임인 단지를 정의하고, 단지에 번호를 붙이려 한다. 여

www.acmicpc.net

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
import java.util.ArrayList;
import java.util.Collections;
import java.util.Scanner;
 
public class Main {
    public static int[][] arr;
    static ArrayList<Integer> container = new ArrayList<Integer>();
 
    public static int[][] visit;
    public static int count = 0;
 
    public static int[] dirRL = { -1100 }; // 좌우 상하 (열)
    public static int[] dirUD = { 00-11 };// 좌우 상하 (행)
 
    public static void dfs(int i, int j, int n) {
        visit[i][j] = 1;
        for (int k = 0; k < 4; k++) {
            int dirY = j + dirUD[k];// 열
            int dirX = i + dirRL[k];// 행
            if (dirX >= 0 && dirY >= 0 && dirX < n && dirY < n) {
                if (arr[dirX][dirY] == 1 && visit[dirX][dirY] == 0) {
                    count++;
                    dfs(dirX, dirY, n);
                }
            }
 
        }
 
    }
 
    public static void main(String[] args) {
 
        Scanner sc = new Scanner(System.in);
 
        int num = sc.nextInt();
        arr = new int[num][num];
        visit = new int[num][num];
 
        for (int i = 0; i < num; i++) {
            String input = sc.next();
 
            for (int j = 0; j < num; j++) {
                arr[i][j] = input.charAt(j) - '0';
 
            }
        }
 
        for (int i = 0; i < num; i++) {
            for (int j = 0; j < num; j++) {
                if (arr[i][j] == 1 && visit[i][j] == 0) {
                    count = 1;
                    dfs(i, j, num);
 
                    container.add(count);
                }
            }
        }
        System.out.println(container.size());
        Collections.sort(container);
        for (int i : container) {
            System.out.println(i);
        }
 
    }
}
cs

 

x열 y행을 받아온다면 x-1행 x+1행 ,y-1행,y+1행을 일일이 다 if문을 통해 돌려주니 ㅋㅋㅋ 스택 오버플로우 에러가 걸렸다. 

 

public static int[] dirRL = { -1100 }; // 좌우 상하 (열)

public static int[] dirUD = { 00-11 };// 좌우 상하 (행)

 

이렇게 상하좌우 플러스/마이너스 값을 미리 배열에 담아주고 

for (int k = 0; k < 4; k++) {

            int dirY = j + dirUD[k];// 열

            int dirX = i + dirRL[k];// 행

            if (dirX >= 0 && dirY >= 0 && dirX < n && dirY < n) {

                if (arr[dirX][dirY] == 1 && visit[dirX][dirY] == 0) {

                    count++;

                    dfs(dirX, dirY, n);

                }

            }

}

 

이런식으로 반복문을 돌려서 그 플마 된 값이 0이상 n 미만인지만 판단해주면 되는 것이였다. 그리고 다시 재귀로 dirX랑 dirY값을 dfs 메서드에 넣어주면 됐다. 생각해보면 간단한데 왜 생각을 못했는지..ㅜ

 

어제 화이자 2차 백신을 맞아서 몸 상태가 꽝이다.. 몸 상태가 회복되면 다시 풀어야겠다 (TMI)

728x90
반응형

댓글