백준 13265 색칠하기

2022. 12. 20. 20:33코딩 공부 연습

반응형

백준 13265 색칠하기


  • 이번 문제는 DFS 를 활용한 색칠 가능 여부를 묻는 문제였다. 사실 이렇게 오래 걸릴게 아니었던 것 같은데 지금까지 상하좌우로 좌표상에서 움직이는 dfs 에 너무 익숙해져버린
    나머지 너무 오래걸렸다.
  • DFS 를 재귀를 통해 푸는 풀이가 많은데 난 아직 큐를 활용하는 방식을 고정해 사용하고 있다. 이 방식이 좀 더 귀찮고 코드 길이도 길고 번거로운 것 같기도 해 재귀를 통한 방식을 새로 익히는 것도 고려
    해봐야겠다.
  • 자바에서 벡터를 이번에 처음 사용해 보았는데, 아직까진 그냥 list 와 큰 차이는 모르겠지만 자주 사용해 보아야겠다.
  • list 를 재귀문 밖에 사용해서 지금까지 계속 틀렸다.
for (int i = 0; i < t; i++) {
            int visited[] = new int[1002];
            int color[] = new int[1002];
            Vector<Vector<Integer>> list = new Vector<Vector<Integer>>();
            StringTokenizer st= new StringTokenizer(scanner.nextLine());

            int n = Integer.parseInt(st.nextToken());
            int m = Integer.parseInt(st.nextToken());

            for (int j = 0; j <= n; j++) {
                list.add(new Vector<Integer>());
            }
            for (int j = 0; j < m; j++) {
                st = new StringTokenizer(scanner.nextLine());
                int from = Integer.parseInt(st.nextToken());
                int to = Integer.parseInt(st.nextToken());
                list.get(from).add(to);
                list.get(to).add(from);
            }
            boolean answer = true;

            Queue<Integer> q = new LinkedList<>();
            for (int j = 1; j <= n; j++) {
                if (visited[j] == 0) {
                    color[j] = 1; visited[j] = 1;
                    q.add(j);
                    while (!q.isEmpty()) {
                        int cur = q.peek(); q.remove();
                        for (int k = 0; k < list.get(cur).size(); k++) {
                            if (color[cur] == color[list.get(cur).get(k)]) {
                                answer = false;
                            }
                            if (visited[list.get(cur).get(k)] == 1 ) continue;
                            color[list.get(cur).get(k)] = 3 - color[cur];
                            q.add(list.get(cur).get(k));
                            visited[list.get(cur).get(k)] = 1;
                        }
                    }
                }
            }
            if (!answer) {
                System.out.println("impossible");
            } else {
                System.out.println("possible");
            }
        }
  • 각 동그라미가 인접해 있는 점을 vector 로 관리해 현재 cur 동그라미와 다른 색을 칠해주다, 만약 이미 칠해진 동그라미가 cur와 같은 색이라면 터뜨려 주었다.

'코딩 공부 연습' 카테고리의 다른 글

백준 9251 LCS  (0) 2022.12.24
백준 15723 n단 논법  (0) 2022.12.21
백준 1932 정수 삼각  (0) 2022.12.16
백준 11726 2xn 타일링  (1) 2022.12.14
백준 6593 상범 빌딩  (0) 2022.12.10