반응형
https://www.acmicpc.net/problem/2667
2667번: 단지번호붙이기
<그림 1>과 같이 정사각형 모양의 지도가 있다. 1은 집이 있는 곳을, 0은 집이 없는 곳을 나타낸다. 철수는 이 지도를 가지고 연결된 집의 모임인 단지를 정의하고, 단지에 번호를 붙이려 한다. 여
www.acmicpc.net

풀이
이전에 풀었던 유기농 배추와 동일한 문제인데 난이도가 아주 조금 올라갔다.
아파트 단지 개수뿐만 아니라 단지 내에 몇 개의 집이 있는지를 구해야 하는 문제로 유기농 배추 문제에서 몇 가지 코드만 추가해주면 쉽게 풀 수 있다.
유기농 배추 문제와 달랐던 건 배열의 모양과 입력할 때이다. 예제를 살펴보면 '0110100'로 들어오는데 한 자리씩 잘라서 int형 배열에 넣어줘야 한다.
map[i][j] = str.charAt(j) - '0';
문자열을 한자리씩 자르는 함수는 대부분 알고 있을 거라고 생각한다. charAt(index) 함수를 이용해서 한 자리씩 자르면 된다. 하지만 출력해보면 1이 아닌 49가 나오는 걸 볼 수 있다. 정수형을 int형으로 변환해서 출력하게 되면 아스키코드값으로 변환이 되기 때문이다. 이를 숫자 1로 변경시켜주기 위해 아스키코드 값이 48인 정수형 '0'을 빼줘야 한다.
<최종코드>
import java.io.*; import java.util.*; public class Main { static int[][] map; static int[][] check; static int aptCnt = 0; public static void main(String[] args) throws IOException{ BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); int N = Integer.parseInt(br.readLine()); map = new int[N][N]; check = new int[N][N]; for (int i=0; i<N; i++) { String str = br.readLine(); for (int j=0; j<N; j++) { map[i][j] = str.charAt(j) - '0'; } } ArrayList<Integer> answer = new ArrayList<>(); int cnt = 0; for (int i=0; i<N; i++) { for (int j=0; j<N; j++) { if (map[i][j] == 1 && check[i][j] == 0) { aptCnt = 0; cnt++; dfs(i, j); answer.add(aptCnt); } } } Collections.sort(answer); System.out.println(cnt); for (int i=0; i<cnt; i++) { System.out.println(answer.get(i)); } } public static void dfs(int x, int y) { check[x][y] = 1; aptCnt++; if (x < map.length-1 && map[x+1][y] == 1 && check[x+1][y] == 0) { dfs(x+1, y); } if (x > 0 && map[x-1][y] == 1 && check[x-1][y] == 0) { dfs(x-1, y); } if (y < map[x].length-1 && map[x][y+1] == 1 && check[x][y+1] == 0) { dfs(x, y+1); } if (y > 0 && map[x][y-1] == 1 && check[x][y-1] == 0) { dfs(x, y-1); } } }
반응형
'알고리즘 > DFS & BFS' 카테고리의 다른 글
[백준]JAVA - 7576번: 토마토 (0) | 2022.10.07 |
---|---|
[백준]JAVA - 2178번: 미로탐색 (0) | 2022.10.05 |
[백준]JAVA - 1697번: 숨바꼭질 (0) | 2022.09.28 |
[백준]JAVA - 1012번: 유기농 배추 (0) | 2022.09.17 |
[프로그래머스]JAVA - Level2. 타겟 넘버 (0) | 2022.09.06 |