필자의 코드는 계속해서 오답이라고 뜨는데, 모든 반례가 다 알맞게 출력된다.
import java.io.*;
import java.util.*;
class Main {
static int[][] grid;
static boolean[][] visited;
static int[][] vector = {{1, 0}, {-1, 0}, {0, -1}, {0, 1}};
static int count;
public static void main(String[] args) throws IOException {
Scanner sc = new Scanner(System.in);
int n = sc.nextInt();
grid = new int[n+1][n+1];
visited = new boolean[n+1][n+1];
for(int j =1; j<n+1; j++){
String temp = sc.next();
for(int i =1; i<n+1; i++){
grid[j][i] = temp.charAt(i-1) - '0';
}
}
PriorityQueue<Integer> pq = new PriorityQueue<>();
for(int j =1; j<n+1; j++){
for(int i =1; i<n+1; i++){
if(grid[j][i] == 1 && visited[j][i] == false){
count =0;
dfs(j, i);//count값
pq.offer(count);
}
}
}
System.out.println(pq.size());
while(!pq.isEmpty()){
System.out.println(pq.poll());
}
}
//시작점을 변수로 받아 확인, 출력 후 다음 연결점을 찾아 시작점을 변경하여 재호출
public static void dfs(int j, int i) {
int x = i, y = j;
visited[j][i] = true;
count ++;
for (int k = 0; k < 4; k++) {
x += vector[k][0];//+1 -1
y += vector[k][1];//+1 -1
if(x<0||y<0||x>=visited[1].length||y>=visited.length) continue; //overflow방지
if (visited[y][x] == false && grid[y][x] == 1) {
dfs(y, x);
}
//초기화
x = i;
y = j;
}
}
}
따라서 다른 코드를 살펴보겠다.
아래와같다.
import java.util.*;
public class Main {
public static void main(String[] args) {
int[] dy = { -1, 1, 0, 0 };
int[] dx = { 0, 0, -1, 1 };
Scanner sc = new Scanner(System.in);
List<Integer> ans = new ArrayList<>();
int N = sc.nextInt();
boolean[][] map = new boolean[N][N];
for (int i = 0; i < N; i++) {
String input = sc.next();
for (int j = 0; j < N; j++)
map[i][j] = input.charAt(j) == '1';
}
Queue<int[]> que = new LinkedList<>();
for (int i = 0; i < N; i++) {
for (int j = 0; j < N; j++) {
if (!map[i][j])
continue;
que.add(new int[] { i, j });
map[i][j] = false;
int size = 0;
while (!que.isEmpty()) {
int[] cur = que.poll();
size++;
for (int k = 0; k < 4; k++) {
int ny = cur[0] + dy[k];
int nx = cur[1] + dx[k];
if (ny < 0 || nx < 0 || nx >= N || ny >= N || !map[ny][nx])
continue;
que.add(new int[] { ny, nx });
map[ny][nx] = false;
}
}
ans.add(size);
}
}
System.out.println(ans.size());
ans.sort(null);
ans.stream().forEach(System.out::println);
}
}
백준 2667 단지번호붙이기 java
과 같이 정사각형 모양의 지도가 있다. 1은 집이 있는 곳을, 0은 집이 없는 곳을 나타낸다. 철수는 이 지도를 가지고 연결된 집들의 모임인 단지를 정의하고, 단지에 번호를 붙이려 한다. 여기서
1-7171771.tistory.com
반응형
'코딩테스트 > Java' 카테고리의 다른 글
(2019 카카오) 실패율 Java (0) | 2020.12.21 |
---|---|
(2019 카카오)크레인 인형뽑기 게임 Java (0) | 2020.12.18 |
[JAVA] 백준 "바이러스" (0) | 2020.12.03 |
[JAVA] 백준 "DFS와 BFS" (0) | 2020.12.02 |
[JAVA] 그래프 "순서" (0) | 2020.12.01 |