99클럽 코테 스터디 18일차 단지번호붙이기

2024. 8. 9. 00:57·스터디/99클럽 코테 스터디 TIL

📝 문제

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

🔥 시도해본 접근 방식

지도를 2차원 배열로 구하고, DFS로 인접한 노드를 탐색하는 방식으로 접근 해야겠다고 생각했다.

 

1️⃣ 첫번째 시도

import java.util.*;

public class Main {
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        int[][] matrix;

        int N = Integer.parseInt(sc.nextLine()); // 지도의 크기 N x N
        matrix = new int[N][N];

        for (int i = 0; i < N; i++) {
            String[] row = sc.nextLine().split("");
            for (int j = 0; j < N; j++) {
                matrix[i][j] = Integer.parseInt(row[j]);
            }
        }

        Graph graph = new Graph(N, matrix);

        List<Integer> houseGroupList = new ArrayList<>();

        for (int i = 0; i < N; i++) {
            for (int j = 0; j < N; j++) {
                if (!graph.map[i][j].visited && graph.map[i][j].data == 1) {
                    int cnt = graph.dfs(i, j);
                    houseGroupList.add(cnt);
                }
            }
        }

        Collections.sort(houseGroupList);

        System.out.println(houseGroupList.size());
        for (int i : houseGroupList) {
            System.out.println(i);
        }
    }
}

class Graph {
    Node[][] map;

    // 위, 왼쪽, 아래, 오른쪽
    int[] dx = {0, -1, 0, 1};
    int[] dy = {-1, 0, 1, 0};

    Graph(int size, int[][] map) {
        this.map = new Node[size][size];

        for (int i = 0; i < size; i++) {
            for (int j = 0; j < size; j++) {
                this.map[i][j] = new Node(i, j, map[i][j]);
            }
        }
    }

    public int dfs(int x, int y) {
        // 대기열
        Stack<Node> s = new Stack();

        // 인접한 집의 갯수
        int count = 0;

        s.push(this.map[x][y]);
        this.map[x][y].visited = true;

        while (!s.isEmpty()) {
            Node n = s.pop();

            count++;

            for (int i = 0; i < 4; i++) {
                int newX = n.x + dx[i];
                int newY = n.y + dy[i];

                if (newX < 0 || newX >= 7 || newY < 0 || newY >= 7) continue;

                Node visitNode = map[newX][newY];

                if (!visitNode.visited && visitNode.data == 1) {
                    s.push(visitNode);
                    visitNode.visited = true;
                }
            }
        }
        return count;
    }

    static class Node {
        int data;
        int x;
        int y;
        boolean visited;

        Node(int x, int y, int data) {
            this.data = data;
            this.x = x;
            this.y = y;
            this.visited = false;
        }
    }
}

위와 같이 작성하였고 제출하였지만 첫번째 시도는 실패하였다. 

 

왜 실패했는지 곰곰히 코드를 보니 newX, newY의 바운더리 조건을 체크하는 부분에서 테스트할때 사용하던 하드코딩 7을 그대로 사용하고 있었던 것을 발견하였다.

✨ 성공 코드

import java.util.*;

public class Main {
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        int[][] matrix;

        int N = Integer.parseInt(sc.nextLine()); // 지도의 크기 N x N
        matrix = new int[N][N];

        for (int i = 0; i < N; i++) {
            String[] row = sc.nextLine().split("");
            for (int j = 0; j < N; j++) {
                matrix[i][j] = Integer.parseInt(row[j]);
            }
        }

        Graph graph = new Graph(N, matrix);

        List<Integer> houseGroupList = new ArrayList<>();

        for (int i = 0; i < N; i++) {
            for (int j = 0; j < N; j++) {
                if (!graph.map[i][j].visited && graph.map[i][j].data == 1) {
                    int cnt = graph.dfs(i, j);
                    houseGroupList.add(cnt);
                }
            }
        }

        Collections.sort(houseGroupList);

        System.out.println(houseGroupList.size());
        for (int i : houseGroupList) {
            System.out.println(i);
        }
    }
}

class Graph {
    Node[][] map;
    int size;

    // 위, 왼쪽, 아래, 오른쪽
    int[] dx = {0, -1, 0, 1};
    int[] dy = {-1, 0, 1, 0};

    Graph(int size, int[][] map) {
        this.size = size;
        this.map = new Node[size][size];

        for (int i = 0; i < size; i++) {
            for (int j = 0; j < size; j++) {
                this.map[i][j] = new Node(i, j, map[i][j]);
            }
        }
    }

    public int dfs(int x, int y) {
        // 대기열
        Stack<Node> s = new Stack();

        // 인접한 집의 갯수
        int count = 0;

        s.push(this.map[x][y]);
        this.map[x][y].visited = true;

        while (!s.isEmpty()) {
            Node n = s.pop();

            count++;

            for (int i = 0; i < 4; i++) {
                int newX = n.x + dx[i];
                int newY = n.y + dy[i];

                if (newX < 0 || newX >= this.size || newY < 0 || newY >= this.size) continue;

                Node visitNode = map[newX][newY];

                if (!visitNode.visited && visitNode.data == 1) {
                    s.push(visitNode);
                    visitNode.visited = true;
                }
            }
        }
        return count;
    }

    static class Node {
        int data;
        int x;
        int y;
        boolean visited;

        Node(int x, int y, int data) {
            this.data = data;
            this.x = x;
            this.y = y;
            this.visited = false;
        }
    }
}

'스터디 > 99클럽 코테 스터디 TIL' 카테고리의 다른 글

99클럽 코테 스터디 20일차 큰 수 만들기  (0) 2024.08.11
99클럽 코테 스터디 19일차 구명보트 [작성중]  (0) 2024.08.10
99클럽 코테 스터디 17일차 촌수계산 [작성중]  (0) 2024.08.08
99클럽 코테 스터디 16일차 모음사전  (0) 2024.08.07
99클럽 코테 스터디 15일차 prefix-and-suffix-search  (0) 2024.08.06
'스터디/99클럽 코테 스터디 TIL' 카테고리의 다른 글
  • 99클럽 코테 스터디 20일차 큰 수 만들기
  • 99클럽 코테 스터디 19일차 구명보트 [작성중]
  • 99클럽 코테 스터디 17일차 촌수계산 [작성중]
  • 99클럽 코테 스터디 16일차 모음사전
Been
Been
  • Been
    Been
    Been
  • 전체
    오늘
    어제
    • 분류 전체보기 (60)
      • 언어 (0)
        • Kotlin (0)
      • 안드로이드 (17)
      • iOS (3)
      • Git (1)
      • 스터디 (39)
        • 알고리즘 문제 풀이 (1)
        • 99클럽 코테 스터디 TIL (38)
  • 블로그 메뉴

    • 홈
    • 태그
    • 방명록
  • 링크

  • 공지사항

  • 인기 글

  • 태그

    언더라인 제거
    NSR
    IOS
    TIL
    Androiod
    객체변환
    풀이실패
    RecyclerView
    안드로이드
    99클럽
    WRITE EXTERNAL
    maxWidth
    EditText
    자바
    Coroutines
    Git
    항해99
    Android
    밑줄제거
    아이폰
    java
    debugRuntimeClasspath
    FragmentStateAdapter
    리싸이클러뷰
    nsl
    쓰기권한
    개발자취업
    AndroidID
    코딩테스트준비
    깃
  • 최근 댓글

  • 최근 글

  • hELLO· Designed By정상우.v4.10.0
Been
99클럽 코테 스터디 18일차 단지번호붙이기
상단으로

티스토리툴바