[BOJ/λ°±μ€€] 4963. μ„¬μ˜ 개수 (JAVA)

2025. 2. 7. 09:53Β·πŸ’ͺ Algorithm
λ°˜μ‘ν˜•

링크

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

 

 

문제 μš”μ•½

h*w μ‚¬κ°ν˜• 지도에 섬 λ˜λŠ” λ°”λ‹€κ°€ ν‘œμ‹œλ˜μ–΄ μžˆμ„ λ•Œ μ„¬μ˜ 개수λ₯Ό λ°˜ν™˜ν•˜κΈ°

μ΄λ•Œ κ°€λ‘œ, μ„Έλ‘œ, λŒ€κ°μ„ μœΌλ‘œ μ—°κ²°λ˜μ–΄ μžˆλŠ” 섬은 같은 섬이닀.

 

μ œν•œ

  • μž…λ ₯은 μ—¬λŸ¬ 개의 ν…ŒμŠ€νŠΈ μΌ€μ΄μŠ€λ‘œ 이루어져 μžˆλ‹€. 각 ν…ŒμŠ€νŠΈ μΌ€μ΄μŠ€μ˜ 첫째 μ€„μ—λŠ” μ§€λ„μ˜ λ„ˆλΉ„ w와 높이 hκ°€ μ£Όμ–΄μ§„λ‹€.
    • w와 hλŠ” 50보닀 μž‘κ±°λ‚˜ 같은 μ–‘μ˜ μ •μˆ˜μ΄λ‹€.
  • λ‘˜μ§Έ 쀄뢀터 h개 μ€„μ—λŠ” 지도가 μ£Όμ–΄μ§„λ‹€.
    • 1은 λ•…, 0은 바닀이닀.
  • μž…λ ₯의 λ§ˆμ§€λ§‰ μ€„μ—λŠ” 0이 두 개 μ£Όμ–΄μ§„λ‹€.
  • w와 hλŠ” 50보닀 μž‘κ±°λ‚˜ 같은 μ–‘μ˜ μ •μˆ˜μ΄λ‹€.

 

풀이

κ°€λ‘œ, μ„Έλ‘œ, λŒ€κ°μ„ μœΌλ‘œ μ—°κ²°λ˜μ–΄ μžˆμ§€ μ•Šμ€ 1의 개수λ₯Ό μ„ΈλŠ” λ¬Έμ œμž…λ‹ˆλ‹€.

 

즉, μ˜μ—­μ˜ 개수λ₯Ό κ΅¬ν•˜λŠ” λ¬Έμ œμ΄λ―€λ‘œ DFS λ˜λŠ” BFS둜 ν’€ 수 μžˆμŠ΅λ‹ˆλ‹€.

μ €λŠ” DFS둜 문제λ₯Ό ν’€μ—ˆμŠ΅λ‹ˆλ‹€.

 

  1. μ‹œμž‘μ μœΌλ‘œλΆ€ν„° κ°€λ‘œ, μ„Έλ‘œ, λŒ€κ°μ„  λ°©ν–₯으둜 탐색 κ°€λŠ₯ν•œ λͺ¨λ“  λ•…(1) 칸을 μ°ΎλŠ”λ‹€.
    1. 아직 λ°©λ¬Έν•˜μ§€ μ•Šμ€ λ•…(1)만 μ‹œμž‘μ μ΄ 될 수 μžˆλ‹€.
    2. μ‹œμž‘μ  근처의 λ•…(1) 칸을 발견면, λ‹€μŒ 기쀀점을 ν•΄λ‹Ή 칸으둜 μ§€μ •ν•˜μ—¬ μ—°μ†μ μœΌλ‘œ νƒμƒ‰ν•œλ‹€.
    3. 각 칸에 λ°©λ¬Έ ν‘œμ‹œλ₯Ό 남긴닀.
  2. 더 이상 탐색 κ°€λŠ₯ν•œ λ•…(1) 칸이 μ—†μœΌλ©΄, ν•˜λ‚˜μ˜ 섬 μ˜μ—­μ— λŒ€ν•œ 탐색이 μ™„λ£Œλœ 것이닀.
  3. λ‹€μŒ μ‹œμž‘μ μ„ κΈ°μ€€μœΌλ‘œ 1~3 과정을 λ°˜λ³΅ν•œλ‹€.
    1. 각 μ‹œμž‘μ λ§ˆλ‹€ 섬 개수 카운트λ₯Ό 1 μ¦κ°€μ‹œν‚¨λ‹€.

 

탐색 κ°€λŠ₯ν•œ μ˜μ—­μ˜ 기쀀은 λ‹€μŒ 3κ°€μ§€ 기쀀을 λͺ¨λ‘ λ§Œμ‘±ν•΄μ•Ό ν•©λ‹ˆλ‹€.

  1. 지도 λ²”μœ„ λ‚΄λΆ€μ—¬μ•Ό ν•œλ‹€.(지도 λ²”μœ„ 밖이면 λŸ°νƒ€μž„ μ—λŸ¬ λ°œμƒ κ°€λŠ₯)
  2. 값이 1이어야 ν•œλ‹€.(=λ°”λ‹€κ°€ μ•„λ‹Œ 섬이어야 ν•œλ‹€)
  3. 이전에 λ°©λ¬Έν•œ 적이 μ—†λŠ” μ˜μ—­μ΄μ–΄μ•Ό ν•œλ‹€.

⇒ 이 쑰건듀을 잘 κ³ λ €ν•˜μ—¬ 문제λ₯Ό ν’€μ–΄μ•Ό ν•©λ‹ˆλ‹€!

 

μ½”λ“œ

import java.util.*;
import java.io.*;

public class Main {
    static boolean[][] visited;
    static int[][] board;
    static int cnt;
    static int[] dirX = {1,0,-1,0,1,-1,-1,1};
    static int[] dirY = {0,1,0,-1,1,1,-1,-1};
    public static void main(String[] args) throws Exception {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        StringTokenizer st;

        while(true) {
            cnt = 0;
            st = new StringTokenizer(br.readLine());
            int w = Integer.parseInt(st.nextToken());
            int h = Integer.parseInt(st.nextToken());
            if (w == 0 && h == 0) return;
            visited = new boolean[h][w];
            board = new int[h][w];

            for(int i=0; i<h; i++){
                st = new StringTokenizer(br.readLine());
                for(int j=0; j<w; j++){
                    board[i][j] = Integer.parseInt(st.nextToken());
                }
            }
            for(int i=0; i<h; i++){
                for(int j=0; j<w; j++){
                    if(!visited[i][j] && board[i][j]==1) {
                        dfs(i,j);
                        cnt++;
                    }
                }
            }
            System.out.println(cnt);
        }
    }

    static void dfs(int curx, int cury){
        visited[curx][cury] = true;
        for(int i=0; i<dirX.length; i++){
            int nx = curx+dirX[i];
            int ny = cury+dirY[i];

            if(nx<0 || ny<0 || nx>=board.length || ny>=board[0].length) continue;
            if(visited[nx][ny] || board[nx][ny]==0) continue;

            visited[nx][ny] = true;
            dfs(nx,ny);
        }
    }
}

🏷 μ‹œκ°„ λ³΅μž‘λ„

  • 첫 2쀑 forλ¬Έ: `O(h*w)`
  • 두 번째 2쀑 forλ¬Έ: `O(h*w)`
    • dfs ν•¨μˆ˜κ°€ 아직 λ°©λ¬Έν•˜μ§€ μ•Šμ€ 1 κ°’ 개수만큼 ν˜ΈμΆœν•˜κ²Œ λ˜λ―€λ‘œ `O(h*w)`
      • 1 κ°’(λ•…) κ°œμˆ˜λŠ” μ΅œλŒ€ `h*w`
  • μ΅œμ’… μ‹œκ°„ λ³΅μž‘λ„: `O(hw)`+`O(hw)` = `O(h*w)` = `O(N)`
    • `N`=`h*w`
    • N의 μ΅œλŒ“κ°’μ€ 50*50=2500

 

🏷 μ‹€ν–‰ 속도

Time: 144 ms, Memory: 15876 KB

λ°˜μ‘ν˜•

'πŸ’ͺ Algorithm' μΉ΄ν…Œκ³ λ¦¬μ˜ λ‹€λ₯Έ κΈ€

[BOJ/λ°±μ€€] 1931 νšŒμ˜μ‹€ λ°°μ •(JAVA)  (1) 2025.02.10
[BOJ/λ°±μ€€] 2573 λΉ™μ‚° (JAVA)  (1) 2025.02.09
[ν”„λ‘œκ·Έλž˜λ¨ΈμŠ€] 크레인 μΈν˜•λ½‘κΈ° κ²Œμž„ (JAVA)  (1) 2025.02.06
[ν”„λ‘œκ·Έλž˜λ¨ΈμŠ€] 주식 가격 (JAVA)  (2) 2025.02.05
'πŸ’ͺ Algorithm' μΉ΄ν…Œκ³ λ¦¬μ˜ λ‹€λ₯Έ κΈ€
  • [BOJ/λ°±μ€€] 1931 νšŒμ˜μ‹€ λ°°μ •(JAVA)
  • [BOJ/λ°±μ€€] 2573 λΉ™μ‚° (JAVA)
  • [ν”„λ‘œκ·Έλž˜λ¨ΈμŠ€] 크레인 μΈν˜•λ½‘κΈ° κ²Œμž„ (JAVA)
  • [ν”„λ‘œκ·Έλž˜λ¨ΈμŠ€] 주식 가격 (JAVA)
dev-heyjin
dev-heyjin
  • dev-heyjin
    개발 기둝
    dev-heyjin
  • 전체
    였늘
    μ–΄μ œ
    • λΆ„λ₯˜ 전체보기 (56)
      • 🎯 Programming (8)
      • πŸ’ͺ Algorithm (16)
      • βš™οΈ CS (31)
        • λ„€νŠΈμ›Œν¬ (15)
        • 운영체제 (15)
        • λ°μ΄ν„°λ² μ΄μŠ€ (0)
  • λΈ”λ‘œκ·Έ 메뉴

    • ν™ˆ
    • νƒœκ·Έ
    • λ°©λͺ…둝
  • 링크

  • 곡지사항

  • 인기 κΈ€

  • νƒœκ·Έ

    DB
    RDS
    ν•΄ν‚Ή
    λ°μ΄ν„°λ² μ΄μŠ€
  • 졜근 λŒ“κΈ€

  • 졜근 κΈ€

  • hELLOΒ· Designed Byμ •μƒμš°.v4.10.3
dev-heyjin
[BOJ/λ°±μ€€] 4963. μ„¬μ˜ 개수 (JAVA)
μƒλ‹¨μœΌλ‘œ

ν‹°μŠ€ν† λ¦¬νˆ΄λ°”