코딩테스트/Java

[JAVA] 백준 "단지번호붙이기"

SK_MOUSE 2020. 12. 3. 15:56
반응형

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

 

필자의 코드는 계속해서 오답이라고 뜨는데, 모든 반례가 다 알맞게 출력된다.

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);

	}
}

1-7171771.tistory.com/57

 

백준 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