inflearn logo
강의

강의

N
챌린지

챌린지

멘토링

멘토링

N
클립

클립

로드맵

로드맵

지식공유

[자바/Java] 문과생도 이해하는 DFS 알고리즘! - 입문편

섬의 개수 (백준 4963)

백준 실행시 틀립니다.

해결된 질문

372

endeavor

작성한 질문수 7

1

안녕하세요 강사님.
문제를 풀고 백준에 제출했을 때 계속 오답으로 나와 질문 드립니다..

제가 봤을 때 강사님 코드랑 거의 비슷하게 수정까지 한 것 같은데.. 어떤 부분이 잘못되었는지 확인 한번 부탁드립니다.

import java.io.*;
import java.util.StringTokenizer;

public class Main {
    final static int MAX = 50 + 10;
    static boolean map[][];
    static boolean visited[][];
    /*    static int dirY[] = {1, 1, 1, 0, 0, -1, -1, -1};
        static int dirX[] = {-1, 0, 1, -1, 1, -1, 0, 1};*/
    static int dirY[] = {-1, -1, 0, 1, 1, -1, 0, -1};
    static int dirX[] = {0, 1, 1, -1, 0, -1, -1, -1};
    static int N, M;


    public static void main(String[] args) throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));

        while (true) {
            StringTokenizer st = new StringTokenizer(br.readLine());
            M = Integer.parseInt(st.nextToken()); // 너비 x
            N = Integer.parseInt(st.nextToken()); // 높이 y

            if (N == 0 && M == 0) break;

            map = new boolean[MAX][MAX];
            visited = new boolean[MAX][MAX];

            // 1. map 정보 반영
            for (int i = 1; i <= N; i++) {
                st = new StringTokenizer(br.readLine());
                for (int j = 1; j <= M; j++) {
                    map[j][i] = Integer.parseInt(st.nextToken()) == 1;
                }
            }

            // 2. dfs
            int result = 0;
            for (int i = 1; i <= N; i++) {
                for (int j = 1; j <= M; j++) {
                    if (map[i][j] && !visited[i][j]) {
                        dfs(i, j);
                        result++;
                    }
                }
            }

            // 3. 출력
            bw.write(String.valueOf(result));
            bw.newLine();
        }

        bw.close();
        bw.close();
    }

    private static void dfs(int y, int x) {
        visited[y][x] = true;

        for (int i = 0; i < 8; i++) {
            int newY = dirY[i] + y;
            int newX = dirX[i] + x;
            if (map[newY][newX] && !visited[newY][newX]) {
                dfs(newY, newX);
            }
        }
    }
}


java 코딩-테스트 알고리즘 dfs

답변 1

2

개발자로 취직하기

안녕하세요 🙂

코드를 보니 두 곳이 수정되어야 할 것 같아요!

  1. map 정보 입력 받는 단계에서 map[i][j] 에 입력 받는 게 아니고 map[j][i] 로 입력받아서 문제가 되는 것 같아요! map[j][i]로 입력 받으면 접근할 때도 동일하게 맞춰도 되는데, 제 강의에서 map[i][j] 로 말씀드렸습니다!

  2. dirY dirX 가 8 방향을 다 표현하지 못하고 있습니다! 예를 들어 5번 7번 인덱스가 같은 위치를 가리키고 있으니 8방향 다 확인되게 수정해주면 답이 잘 나올것 같습니다 :)

1

endeavor

계속 확인해도 눈에 안보였는데.. 감사합니다 ㅠㅠ

dfs 부문을 이렇게 작성해도 되나요?

1

74

1

x랑 y를 거꾸로 쓰는 개념이 너무 헷갈립니다...

1

96

2

dfs 파라미터에 count를 넣는이유

1

64

2

graph 채울때 for문 설계 질문

1

72

2

질문있습니다.

1

74

1

다른 강의 언제나오나용?

1

93

2

노드간 거리 계산

1

145

1

안녕하세요, 혹시 다른문제도 여쭤볼 수 있을까요?

1

130

1

최근에 올린 질문, 코드블럭으로 공유드립니다!

1

143

1

질문이 있습니다. dfs 메서드에 order를 이렇게 구현하면 안되는 이유가 무엇인가요?

0

134

2

깊이우선탐색2 백준 24480 수업노트에...

1

119

1

백준 24479 문제 제출 결과 "틀렸습니다" 라고만 나와서 어떤 부분이 틀렸는지 잘 모르겠어요 피드백 부탁드립니다

1

250

3

graph 만들때 boolean[][] 으로 만드는 경우랑 int[][] 나 ArrayList<Integer>[] 로 만드는 기준이 어떻게 되나요?

1

202

2

graph를 2차원 배열 또는 List로 하는 기준을 어떤식으로 잡으면 좋을까요...?

1

224

1

강사님 안녕하세요! 깊이 우선 탐색 2 (백준 24480)에서 제공하는 풀이 코드에서 궁금한 점이 있어서 질문 드립니다!

1

327

3

촌수 계산

1

354

3

연결 요소의 개수 (백준 11724)

1

267

1

백준 24479 문제 시간 초과 질문 드려요

1

382

1

재귀대신 스택으로 구현하면 안될까요?

1

409

1

dfs 매개변수에서 y,x 를 왜 순서를 반대로 쓰셨는지 궁금합니다.

1

371

1

안녕하세요 11724번 질문드려요!

2

315

1

출력할 때 BufferedWriter? StringBuilder?

1

510

1

answer++ 위치 질문

1

256

1

code의 어디가 잘못된지 도저히 모르겠습니다..

1

271

1