코딍코딍
코딩기록
코딍코딍
전체 방문자
오늘
어제
  • 분류 전체보기 (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 정상우.
코딍코딍

코딩기록

알고리즘/백준

1012번 : 유기농 배추

2022. 8. 4. 16:15

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

 

1012번: 유기농 배추

차세대 영농인 한나는 강원도 고랭지에서 유기농 배추를 재배하기로 하였다. 농약을 쓰지 않고 배추를 재배하려면 배추를 해충으로부터 보호하는 것이 중요하기 때문에, 한나는 해충 방지에 

www.acmicpc.net

 

 

문제

 

 

코드

BFS

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

public class Main {
    static int [][] g;
    static int m,n;
    public static void main(String[] args) throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        int t = Integer.parseInt(br.readLine());
        StringBuilder sb = new StringBuilder();
        for(int i=0;i<t;i++) {
            StringTokenizer st = new StringTokenizer(br.readLine(), " ");
            m = Integer.parseInt(st.nextToken()); 
            n = Integer.parseInt(st.nextToken()); 
            int k = Integer.parseInt(st.nextToken());
            g=new int[m][n];
            
            //배추 심기
            for(int j=0;j<k;j++) {
                st = new StringTokenizer(br.readLine(), " ");
                int x = Integer.parseInt(st.nextToken());
                int y = Integer.parseInt(st.nextToken());
                g[x][y] = 1;
            }
            
            //모든 칸 탐색 수행
            int count=0;
            for(int z=0;z<m;z++) {
                for(int l=0;l<n;l++) {
                    if(bfs(z,l)) count++;
                }
            }
            sb.append(count+"\n");
        }
        System.out.println(sb);
    }

    static int dx[] = {0,0,-1,1};
    static int dy[] = {-1,1,0,0};
    static boolean bfs(int x, int y) {
        Queue<int[]> q = new LinkedList<>();
        if(g[x][y]==0) return false;
        q.add(new int[]{x,y});

        while(!q.isEmpty()) {
            int[] poll = q.poll();
            x = poll[0];
            y = poll[1];
            for(int i=0;i<4;i++) {
                int nx = x + dx[i];
                int ny = y + dy[i];
                if(nx<0 || ny <0 || nx>=m || ny>=n) continue;
                if(g[nx][ny]==1) {
                    g[nx][ny]=0;
                    q.add(new int[]{nx,ny});
                }
            }
        }
        return true;
    }
}

DFS

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

public class Main {
    static int [][] g;
    static int m,n;
    public static void main(String[] args) throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        int t = Integer.parseInt(br.readLine());
        StringBuilder sb = new StringBuilder();
        for(int i=0;i<t;i++) {
            StringTokenizer st = new StringTokenizer(br.readLine(), " ");
            m = Integer.parseInt(st.nextToken()); 
            n = Integer.parseInt(st.nextToken());
            int k = Integer.parseInt(st.nextToken());
            g=new int[m][n];
            
            //배추 심기
            for(int j=0;j<k;j++) {
                st = new StringTokenizer(br.readLine(), " ");
                int x = Integer.parseInt(st.nextToken());
                int y = Integer.parseInt(st.nextToken());
                g[x][y] = 1;
            }
            
            //모든 칸 탐색 수행
            int count=0;
            for(int z=0;z<m;z++) {
                for(int l=0;l<n;l++) {
                    if(dfs(z,l)) count++;
                }
            }
            sb.append(count+"\n");
        }
        System.out.println(sb);
    }

    static int dx[] = {0,0,-1,1};
    static int dy[] = {-1,1,0,0};
    static boolean dfs(int x, int y) {
        if(g[x][y]==0) return false;
        g[x][y]=0;

        for(int i=0;i<4;i++) {
            int nx = x + dx[i];
            int ny = y + dy[i];
            if(nx<0 || ny <0 || nx>=m || ny>=n) continue;
            if(g[nx][ny]==1) dfs(nx,ny);
        }
        return true;
    }

}

 

해결방법

BFS와 DFS 2가지 방식으로 풀었다. 어디에 배추에 심어져있을 지 모르기에 그래프의 모든 칸을 탐색하였고

지렁이가 갈 수 있는 범위 즉, 1로 이어진 부분이 있다면 너비 우선 탐색 또는 깊이 우선 탐색하여 0으로 바꾼 뒤 true를 반환하여 count를 증가시키는 방식으로 문제를 해결하였다.

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

1654번 : 랜선 자르기  (0) 2022.08.05
2865번 : 나는 위대한 슈퍼스타K  (0) 2022.08.05
2512번 : 예산  (0) 2022.08.03
2805번 : 나무 자르기  (0) 2022.08.02
2667번 : 단지번호붙이기  (0) 2022.08.01
    '알고리즘/백준' 카테고리의 다른 글
    • 1654번 : 랜선 자르기
    • 2865번 : 나는 위대한 슈퍼스타K
    • 2512번 : 예산
    • 2805번 : 나무 자르기
    코딍코딍
    코딍코딍
    ㅎ2

    티스토리툴바