Tany
백문이불어일Tany
Tany
전체 방문자
오늘
어제
  • 분류 전체보기 (197)
    • JAVA TPC (1)
    • JAVA (10)
    • CS (3)
    • SPRING (5)
    • DFS BFS (12)
    • SQL (7)
    • 알고리즘 정리 (76)
    • Git, Github (3)
    • 학습 계획 (36)
    • 코드스쿼드 학습일지 (19)
    • Servlet (5)
    • VPC (2)
    • AWS (4)
    • JPA (5)
    • 취미생활 (2)
    • 프로젝트 기록 (7)
      • Issue Tracker 삽질 기록 (5)
      • 당근마켓 API 서버 기록 (2)
      • 나만의 블로그 제작 기록 (0)

블로그 메뉴

  • 홈
  • 태그
  • 방명록

공지사항

인기 글

태그

  • github
  • 문자열
  • 백준
  • 해시
  • 자바
  • 이분탐색
  • BFS
  • AWS
  • 완전탐색
  • hash
  • MVC
  • 인프런
  • dfs
  • 재귀
  • 파이썬
  • 알고리즘
  • MySQL
  • EC2
  • 주간 학습 계획
  • 정렬
  • 자료구조
  • JSP
  • java
  • sql
  • 프로그래머스
  • 면접을 위한 CS 전공지식 노트
  • Stack
  • JPA
  • GIT
  • 이코테

최근 댓글

최근 글

티스토리

hELLO · Designed By 정상우.
Tany

백문이불어일Tany

자바(Java) 알고리즘 문제풀이 섬의 갯수 [백준 / DFS]
DFS BFS

자바(Java) 알고리즘 문제풀이 섬의 갯수 [백준 / DFS]

2022. 9. 6. 18:55

출처 - 구글 이미지

 

 

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

 

4963번: 섬의 개수

입력은 여러 개의 테스트 케이스로 이루어져 있다. 각 테스트 케이스의 첫째 줄에는 지도의 너비 w와 높이 h가 주어진다. w와 h는 50보다 작거나 같은 양의 정수이다. 둘째 줄부터 h개 줄에는 지도

www.acmicpc.net

 

 

풀이 코드

여러가지 테스트 케이스를 자유롭게 입력받아야 하는 부분이 조금 까다로운 문제였다.

대각선을 허용하기 때문에 4방향 벡터가 아닌 8방향 벡터를 사용해서 풀이하면 되는 문제.

int[][] map 이차원 배열과 동일한 크기의 boolean[][] visited 방문 체크 배열을 따로 만들지 않고 map 배열에서 1인 경우 (땅인 경우) 

일 때 바로 카운팅을 해주고, 해당 좌표를 인자로 가진 DFS() 함수를 재귀 호출 하는 방식으로 풀이했다.

package backjoonsliver.dfs;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;

import java.util.StringTokenizer;

public class 섬의_개수 {

    static int h;
    static int w;
    static int count = 0;
    static int[][] map;
    static int[] dx = {0, -1, 0, 1, -1, -1, 1, 1};
    static int[] dy = {1, 0, -1, 0, 1, -1, 1, -1};

    public static void main(String[] args) throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));

        while (true) {
            StringTokenizer st = new StringTokenizer(br.readLine());
            w = Integer.parseInt(st.nextToken());
            h = Integer.parseInt(st.nextToken());
            map = new int[h][w];

            if (w == 0 && h == 0) {
                break;
            }

            for (int i = 0; i < h; i++) {
                st = new StringTokenizer(br.readLine());
                for (int j = 0; j < w; j++) {
                    map[i][j] = Integer.parseInt(st.nextToken());
                }
            }

            for (int i = 0; i < h; i++) {
                for (int j = 0; j < w; j++) {
                    if (map[i][j] == 1) {
                        count++;
                        DFS(i, j);
                    }
                }
            }

            System.out.println(count);
            count = 0;
        }
    }

    private static void DFS(int x, int y) {
        map[x][y] = 0; // 방문 체크

        for (int i = 0; i < 8; i++) {
            int nx = dx[i] + x;
            int ny = dy[i] + y;

            if (nx >= 0 && ny >= 0 && nx < h && ny < w && map[nx][ny] == 1) {
                map[nx][ny] = 0; // 이동 시 방문 체크
                DFS(nx, ny);
            }
        }
    }
}

// 1 = 땅, 0 = 바다

'DFS BFS' 카테고리의 다른 글

자바(Java) 알고리즘 문제풀이 미로탈출 [이코테 / BFS]  (0) 2022.10.09
자바(Java) 알고리즘 문제풀이 음료수 얼려먹기 [이코테 / DFS]  (0) 2022.10.09
자바(Java) 알고리즘 문제풀이 토마토 [인프런 / BFS]  (0) 2022.09.05
자바(Java) 알고리즘 문제풀이 A->B [백준 / DFS]  (0) 2022.09.05
자바(Java) 알고리즘 문제풀이 음식물 피하기 [백준 / DFS]  (0) 2022.09.05
    'DFS BFS' 카테고리의 다른 글
    • 자바(Java) 알고리즘 문제풀이 미로탈출 [이코테 / BFS]
    • 자바(Java) 알고리즘 문제풀이 음료수 얼려먹기 [이코테 / DFS]
    • 자바(Java) 알고리즘 문제풀이 토마토 [인프런 / BFS]
    • 자바(Java) 알고리즘 문제풀이 A->B [백준 / DFS]
    Tany
    Tany
    내가 보려고 만드는 백엔드 기록장 Github https://github.com/juni8453

    티스토리툴바