코딍코딍
코딩기록
코딍코딍
전체 방문자
오늘
어제
  • 분류 전체보기 (271)
    • 개발 (2)
    • Java (1)
    • 스프링 (28)
    • JPA (11)
    • Git (3)
    • 알고리즘 (160)
      • 백준 (132)
      • 프로그래머스 (8)
      • SWEA (20)
    • 토이 프로젝트 (14)
      • 간단한 Springboot CRUD (1)
      • 게시판 프로젝트 (13)
    • 알고리즘 개념정리 (8)
    • 오류 해결 (13)
    • 보류 (0)
    • AWS (5)
    • 트러블 슈팅 (0)
    • 회고 (3)
    • CS (4)

블로그 메뉴

  • 홈
  • 태그
  • 방명록

공지사항

최근 글

티스토리

hELLO · Designed By 정상우.
코딍코딍

코딩기록

알고리즘/백준

14716번 : 현수막

2023. 10. 9. 21:08

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

 

14716번: 현수막

혁진이의 생각대로 프로그램을 구현했을 때, 현수막에서 글자의 개수가 몇 개인지 출력하여라.

www.acmicpc.net

 

문제

ANT가 처음 알고리즘 대회를 개최하게 되면서 현수막을 내걸었다.

저번 학기 영상처리 수업을 듣고 배웠던 지식을 최대한 응용 해보고 싶은 혁진이는 이 현수막에서 글자가 몇 개인지 알아보는 프로그램을 만들려 한다.

혁진이는 우선 현수막에서 글자인 부분은 1, 글자가 아닌 부분은 0으로 바꾸는 필터를 적용하여 값을 만드는데 성공했다.

그런데 혁진이는 이 값을 바탕으로 글자인 부분 1이 상, 하, 좌, 우, 대각선으로 인접하여 서로 연결되어 있다면 한 개의 글자라고 생각만 하였다.

혁진이가 필터를 적용하여 만든 값이 입력으로 주어졌을 때, 혁진이의 생각대로 프로그램을 구현하면 글자의 개수가 몇 개인지 출력하여라.

 

입력

첫 번째 줄에는 현수막의 크기인 M와 N가 주어진다. (1 ≤ M, N ≤ 250)

두 번째 줄부터 M+1 번째 줄까지 현수막의 정보가 1과 0으로 주어지며, 1과 0을 제외한 입력은 주어지지 않는다.

 

출력

혁진이의 생각대로 프로그램을 구현했을 때, 현수막에서 글자의 개수가 몇 개인지 출력하여라.

 


소스코드

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

class Main {
    static int m, n;
    static int arr[][];
    static boolean visited[][];

    public static void main(String[] args) throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        StringTokenizer st = new StringTokenizer(br.readLine());
        m = Integer.parseInt(st.nextToken());
        n = Integer.parseInt(st.nextToken());
        arr = new int[m][n];
        visited = new boolean[m][n];

        // 그래프 형성
        for (int i = 0; i < m; i++) {
            st = new StringTokenizer(br.readLine());
            for (int j = 0; j < n; j++) {
                arr[i][j] = Integer.parseInt(st.nextToken());
            }
        }

        int result = 0;
        for (int i = 0; i < m; i++) {
            for (int j = 0; j < n; j++) {
                if (bfs(i, j)) result += 1;
            }
        }
        System.out.println(result);
    }

    static int rx[] = new int[]{0, 0, -1, 1, -1, 1, -1, 1};
    static int ry[] = new int[]{-1, 1, 0, 0, -1, 1, 1, -1};
    static boolean bfs(int x, int y) {
        // 이미 방문 했거나 글자가 아닌 경우
        if(visited[x][y] || arr[x][y] == 0) return false;
        ArrayDeque<int[]> q = new ArrayDeque();
        q.addLast(new int[]{x, y});

        while(!q.isEmpty()) {
            int[] now = q.pollFirst();

            for (int i = 0; i < 8; i++) {
                int nx = now[0] + rx[i];
                int ny = now[1] + ry[i];

                if (nx < 0 || ny < 0 || nx >= m || ny >= n) continue;
                if(arr[nx][ny] != 1 || visited[nx][ny]) continue;

                visited[nx][ny] = true;
                q.addLast(new int[]{nx, ny});
            }
        }
        return true;
    }
}

 

해결 방법

  1. 입력값을 받아 그래프를 형성한다. (배열)
  2. 모든 인덱스를 탐색하면서 BFS를 수행한다. 이때 방문한 인덱스는 visited 배열에 저장한다.
  3. BFS 수행 시 이미 방문 했거나 글자가 아닌 경우 false를 반환한다.
  4. BFS 수행 시 글자인 경우 상, 하, 좌, 우, 대각선 방향으로 뻗어가며 인접한 문자를 방문하고 true를 반환한다.

'알고리즘 > 백준' 카테고리의 다른 글

20056번 : 마법사 상어와 파이어볼  (1) 2023.10.17
14725번 : 개미굴  (1) 2023.10.17
1941번 : 소문난 칠공주  (0) 2023.10.04
8979번 : 올림픽 2  (0) 2023.10.03
2792번 : 보석 상자  (0) 2023.10.01
    '알고리즘/백준' 카테고리의 다른 글
    • 20056번 : 마법사 상어와 파이어볼
    • 14725번 : 개미굴
    • 1941번 : 소문난 칠공주
    • 8979번 : 올림픽 2
    코딍코딍
    코딍코딍
    ㅎ2

    티스토리툴바