[JAVA] 백준 11123번 : 양 한마리... 양 두마리...

2025. 5. 14. 10:43·Algorithm

[11123번 : 양 한마리... 양 두마리...] - Silver2

접근 : dfs


[ 문제 ]

얼마전에 나는 불면증에 시달렸지... 천장이 뚫어져라 뜬 눈으로 밤을 지새우곤 했었지.  그러던 어느 날 내 친구 광민이에게 나의 불면증에 대해 말했더니 이렇게 말하더군. "양이라도 세봐!"  정말 도움이 안되는 친구라고 생각했었지. 그런데 막상 또 다시 잠을 청해보려고 침대에 눕고 보니 양을 세고 있더군... 그런데 양을 세다보니 이걸로 프로그램을 하나 짜볼 수 있겠단 생각이 들더군 후후후... 그렇게 나는 침대에서 일어나 컴퓨터 앞으로 향했지.

 

양을 # 으로 나타내고 . 으로 풀을 표현하는 거야. 서로 다른 # 두 개 이상이 붙어있다면 한 무리의 양들이 있는거지. 그래... 좋았어..! 이걸로 초원에서 풀을 뜯고 있는 양들을 그리드로 표현해 보는거야!

 

그렇게 나는 양들을 그리드로 표현하고 나니까 갑자기 졸렵기 시작했어. 하지만 난 너무 궁금했지. 내가 표현한 그 그리드 위에 몇 개의 양무리가 있었는지! 그래서 나는 동이 트기 전까지 이 프로그램을 작성하고 장렬히 전사했지. 다음날 내가 잠에서 깨어났을 때 내 모니터에는 몇 개의 양무리가 있었는지 출력되어 있었지.


[ 입력 ]

첫 번째 줄은 테스트 케이스의 수를 나타나는 T를 입력받는다.

 

이후 각 테스트 케이스의 첫 번째 줄에서는 H,W 를 입력받는다. H는 그리드의 높이이고, W는 그리드의 너비이다. 이후 그리드의 높이 H 에 걸쳐서 W개의 문자로 이루어진 문자열 하나를 입력받는다. 

 

  • 0 < T ≤ 100
  • 0 < H, W ≤ 100

[ 출력 ]

각 테스트 케이스마다, 양의 몇 개의 무리로 이루어져 있었는지를 한 줄에 출력하면 된다. 

# 예제 입력 1
2
4 4
#.#.
.#.#
#.##
.#.#
3 5
###.#
..#..
#.###

# 예제 출력 1
6
3

[ Code ]

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

public class Main {
    static int h, w, ans;
    static char[][] arr;
    static boolean[][] visited;
    static int[] dy = {0, 0, -1, 1};
    static int[] dx = {-1, 1, 0, 0};

    public static void main(String[] args) throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));
        int t = Integer.parseInt(br.readLine());

        for (int i = 0; i < t; i++) {
            StringTokenizer st = new StringTokenizer(br.readLine());
            h = Integer.parseInt(st.nextToken());
            w = Integer.parseInt(st.nextToken());
            arr = new char[h][w];
            visited = new boolean[h][w];

            for (int y = 0; y < h; y++) {
                String str = br.readLine();
                for (int x = 0; x < w; x++) {
                    arr[y][x] = str.charAt(x);
                }
            }

            for (int y = 0; y < h; y++) {
                for (int x = 0; x < w; x++) {
                    if (!visited[y][x] && arr[y][x] == '#') {
                        ans++;
                        dfs(y, x);
                    }
                }
            }

            bw.write(ans + "\n");
            ans = 0;
        }

        bw.close();
    }

    static void dfs(int y, int x) {
        visited[y][x] = true;

        for (int i = 0; i < 4; i++) {
            int moveY = y + dy[i];
            int moveX = x + dx[i];

            if (isValid(moveY, moveX) && !visited[moveY][moveX] && arr[moveY][moveX] == '#') {
                dfs(moveY, moveX);
            }
        }
    }

    static boolean isValid(int moveY, int moveX) {
        return moveY >= 0 && moveX >= 0 && moveY < h && moveX < w;
    }
}

1. 입력

- 각 입력을 char 배열에 넣어준다.

 

2. dfs

- #일 때만(양), visited가 false일 때만(방문하지 않은 경우) dfs를 진행한다.

- 상, 하, 좌, 우 인접한 행이 #(양)일 때 dfs를 계속한다.

 

반응형

'Algorithm' 카테고리의 다른 글

[JAVA] 백준 20166번 : 문자열 지옥에 빠진 호석 - 테스트케이스 (2/16)  (0) 2025.05.16
[JAVA] 백준 16234번 : 인구 이동  (1) 2025.05.15
[JAVA] 백준 16948번 : 데스 나이트  (0) 2025.05.13
[JAVA] 백준 14719번 : 빗물  (0) 2025.05.09
[JAVA] 백준 20922번 : 겹치는 건 싫어  (1) 2025.05.08
'Algorithm' 카테고리의 다른 글
  • [JAVA] 백준 20166번 : 문자열 지옥에 빠진 호석 - 테스트케이스 (2/16)
  • [JAVA] 백준 16234번 : 인구 이동
  • [JAVA] 백준 16948번 : 데스 나이트
  • [JAVA] 백준 14719번 : 빗물
ssu_dev
ssu_dev
  • ssu_dev
    ssu
    ssu_dev
  • 전체
    오늘
    어제
    • 분류 전체보기 (98)
      • Cloud (10)
      • HCI (2)
      • Algorithm (54)
      • Programming (13)
      • Computer Science (5)
      • System (6)
      • Trouble Shooting (6)
      • Work (1)
  • 블로그 메뉴

    • 홈
    • 태그
  • 링크

  • 인기 글

  • 태그

    docker
    자료구조
    K8s
    cs
    bfs
    dfs
    node scaling
    구현
    투포인터
    플로이드 워셜
    BOJ
    EKS
    Deque
    priorityqueue
    Pod Scheduling
    OS
    sort
    Java
    Karpenter
    Stack
  • 최근 글

  • hELLO· Designed By정상우.v4.10.1
ssu_dev
[JAVA] 백준 11123번 : 양 한마리... 양 두마리...
상단으로

티스토리툴바