이 영역을 누르면 첫 페이지로 이동
시간의화살 블로그의 첫 페이지로 이동

시간의화살

페이지 맨 위로 올라가기

시간의화살

행복하세요

[백준] 2667 단지번호붙이기 - Java

  • 2022.05.13 11:11
  • Algorithm/Baekjoon

 

 

 

인접한 집들의 모임은 단지가 된다.

 

단지의 수와 단지 안에 있는 집의 수를 구하는 문제이니.. 지도를 그래프로 표현하고 집들을 묶어주면 될 것 같다.

 

몇 가지 팁을 알고 가자.

 

 

1. 격자점에서 탐색을 수행할 때, 점의 이동을 표현할 때 배열을 통해 구현하면 편하다. (2차원배열 / 1차원배열2개 모두 가능)

 

2. 지도를 입력받을 때 공백 없이 입력된다면 String의 1차원배열을 사용해보자.

 

 

dfs와 bfs 두 가지 방법을 사용할 수 있다.

 

 

 

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

public class Main {

	static int N;
	static int[][] dir = {{1,0}, {0,1}, {-1,0}, {0,-1}};
	// 격자를 탐색할 때 사용할 수 있는 테크닉. 
	// 이차원 배열 말고 1차원 배열 2개로 설정해도 ㅇㅋ. 스타일에 따라서..

	static ArrayList<Integer> complex = new ArrayList<>();;
	// 단지 탐색.
	static int complex_cnt;
	// 한 단지에 몇 개의 집이 있는지.

	static boolean[][] visit;
	// 이미 방문한곳인지 확인해야함.
	static String[] map;
	// 공백 없이 입력이 들어온다. 이럴때는 String배열을 사용하는것도 좋다.

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

		N = Integer.parseInt(br.readLine());

		map = new String[N];

		for(int i=0; i<N; i++){
			map[i] = br.readLine();
		}

		visit = new boolean[N][N];		

		// end of input

		for(int i=0; i<N; i++){
			for(int j=0; j<N; j++){
				if(!visit[i][j] && map[i].charAt(j) == '1'){
					complex_cnt = 0;
					dfs(i,j);
					complex.add(complex_cnt);
				}
			}
		}

		Collections.sort(complex);

		StringBuilder sb = new StringBuilder();

		sb.append(complex.size() + "\n");
		for(int a : complex){
			sb.append(a + "\n");
		}

		System.out.println(sb);


		
	}

	static void dfs(int row, int column){
		complex_cnt++;
		visit[row][column] = true;
		for(int k = 0; k<4; k++){
			int next_row = row + dir[k][0];
			int next_column = column + dir[k][1];
			// column파트가 1이면 column을 조작, 0이면 row를 조작.
			// 격자를 탐색할 때 매우 유용..
			
			if(next_row < 0 || next_column < 0 || next_row >= N || next_column >= N){
				continue; // 지도에서 이탈하면 안됨.
			}

			if(map[next_row].charAt(next_column) == '0'){
				continue; // 지도에서 0 이면 집이 없다는걸 의미 갈 수 없다.
			}

			if(visit[next_row][next_column]){
				continue; // 이미 방문했던 곳이면 다시 갈 필요가 없다.
			}

			dfs(next_row, next_column);
			// 재귀는 믿음으로.. 익숙해지기.. 
		}
	}
}

 

 

 

재귀함수는 계속 봐서 익숙해져야겠다..

반응형

'Algorithm > Baekjoon' 카테고리의 다른 글

[백준] 2251 물통 - Java  (0) 2022.05.14
[백준] 2535 아시아 정보올림피아드 - Java  (0) 2022.05.13
[백준] 1260 DFS와 BFS - Java  (0) 2022.05.12
[백준] 1394 암호 - Java  (0) 2022.05.09
[백준] 1644 소수의 연속합 - Java  (0) 2022.05.09

댓글

이 글 공유하기

  • 구독하기

    구독하기

  • 카카오톡

    카카오톡

  • 라인

    라인

  • 트위터

    트위터

  • Facebook

    Facebook

  • 카카오스토리

    카카오스토리

  • 밴드

    밴드

  • 네이버 블로그

    네이버 블로그

  • Pocket

    Pocket

  • Evernote

    Evernote

다른 글

  • [백준] 2251 물통 - Java

    [백준] 2251 물통 - Java

    2022.05.14
  • [백준] 2535 아시아 정보올림피아드 - Java

    [백준] 2535 아시아 정보올림피아드 - Java

    2022.05.13
  • [백준] 1260 DFS와 BFS - Java

    [백준] 1260 DFS와 BFS - Java

    2022.05.12
  • [백준] 1394 암호 - Java

    [백준] 1394 암호 - Java

    2022.05.09
다른 글 더 둘러보기

정보

시간의화살 블로그의 첫 페이지로 이동

시간의화살

  • 시간의화살의 첫 페이지로 이동

검색

방문자

  • 전체 방문자
  • 오늘
  • 어제

카테고리

  • 분류 전체보기 (605)
    • Algorithm (205)
      • Data Structure (5)
      • Theory && Tip (33)
      • Baekjoon (166)
      • ALGOSPOT (1)
    • Spring (123)
      • Spring (28)
      • Spring Web MVC (20)
      • Spring Database (14)
      • Spring Boot (6)
      • Spring 3.1 (11)
      • Spring Batch (6)
      • Spring Security (16)
      • JPA (12)
      • Spring Data JPA (5)
      • QueryDSL (4)
      • eGovFramework (1)
    • Programming Language (74)
      • Java (19)
      • JavaScript (15)
      • C (25)
      • C++ (12)
      • Python (1)
      • PHP (2)
    • Computer Science (68)
      • Operating System (18)
      • Computer Network (16)
      • System Programming (22)
      • Universial Programming Lang.. (8)
      • Computer Architecture (4)
    • Database (21)
      • Database (7)
      • MySQL (3)
      • Oracle (3)
      • Redis (5)
      • Elasticsearch (3)
    • DevOps (20)
      • Docker && Kubernetes (8)
      • Jenkins (4)
      • Github Actions (0)
      • Amazon Web Service (8)
    • Machine Learning (28)
      • AI Introduction (28)
    • Mobile (28)
      • Android (21)
      • Flutter (7)
    • Solutions (13)
    • Life Logs (0)
    • 낙서장 (25)

최근 글

나의 외부 링크

메뉴

  • 홈

정보

13months의 시간의화살

시간의화살

13months

블로그 구독하기

  • 구독하기
  • RSS 피드

티스토리

  • 티스토리 홈
  • 이 블로그 관리하기
  • 글쓰기
Powered by Tistory / Kakao. Copyright © 13months.

티스토리툴바