반응형
https://www.acmicpc.net/problem/2667
풀이
이전에 풀었던 유기농 배추와 동일한 문제인데 난이도가 아주 조금 올라갔다.
아파트 단지 개수뿐만 아니라 단지 내에 몇 개의 집이 있는지를 구해야 하는 문제로 유기농 배추 문제에서 몇 가지 코드만 추가해주면 쉽게 풀 수 있다.
유기농 배추 문제와 달랐던 건 배열의 모양과 입력할 때이다. 예제를 살펴보면 '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 |