inflearn logo
강의

講義

知識共有

[Java/Java] 文科生も理解するDFSアルゴリズム!

アルゴリズムクラス - 奥行き優先ナビゲーション2(ペクジュン24480)

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

解決済みの質問

327

choihyeok

投稿した質問数 4

1

 

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

class Main {
    final static int MAX = 100000 + 10;
    static ArrayList<Integer>[] graph;
    static boolean[] visited;
    static int N, M, R;
    static int[] answer;
    static int order;

    public static void dfs(int idx){
        visited[idx] = true;
        answer[idx] = order;
        order++;

        for(int i = 0; i < graph[idx].size(); i++){
            int next = graph[idx].get(i);
            if(visited[next] == false)
                dfs(next);
        }
    }

    public static void main(String[] args) throws IOException{
        // 0. 입력 및 초기화
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));

        StringTokenizer st = new StringTokenizer(br.readLine());
        N = Integer.parseInt(st.nextToken());
        M = Integer.parseInt(st.nextToken());
        R = Integer.parseInt(st.nextToken());
        
        // 1. graph에 연결 정보 채우기
        graph = new ArrayList[MAX];
        for(int i = 1; i <= N; i++)
            graph[i] = new ArrayList<>();
        visited = new boolean[MAX];
        answer = new int[MAX];
        order = 1;

        for(int i = 0; i < M ;i++){
            st = new StringTokenizer(br.readLine());
            int x = Integer.parseInt(st.nextToken());
            int y = Integer.parseInt(st.nextToken());
            graph[x].add(y);
            graph[y].add(x);
        }

        // 2. 오름차순 정렬
        for(int i = 1; i <= N; i++)
            Collections.sort(graph[i], Collections.reverseOrder());

        // 3. dfs(재귀함수 호출)
        dfs(R);

        // 4. 출력
        for(int i = 1; i <=N; i++){
            bw.write(String.valueOf(answer[i]));
            bw.newLine();
        }
        
        bw.close();
        br.close();
    }
}

 

위 제공 답안 코드에서

Collections.reverseOrder()

위 처럼 revserOrder()를 걸어주신게 잘못 작성된 내용 같은데 혹시 제가 잘못 확인한걸까요?

일단 해당 코드로 그대로 백준에 올리면 안되고 있는 상태입니다!

그리고 answer나 visited에 MAX를 넣으시는 이유가 궁급합니다! 방문정보나 answer의 경우 N+1로도 초기화가 가능하지 않나요?

 

혹시 더 복잡한 문제등에서 풀이의 간결성을 위해 필요한 방법일까요??

 

 

--

강의 너무 잘 보고 있습니다! 훌륭한 강의 찍어주셔서 감사합니다!

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

回答 3

1

gaebaljob

찬혁님 안녕하세요 🙂 알림 메일을 늦게 확인해서 이제야 답변 드려서 죄송합니다 ㅠ 많이 늦어졌네요.

댓글 남겨주신 대로 위 답안은 정답이 잘 나오는 것 같아요!

그리고 MAX와 N+1과 관련된 질문에 대해서는 찬혁님 말씀이 맞습니다! N+1로 해도 정답이 나오고, 이렇게 짜는 게 가장 효율적인 답변이 되는 것이 맞습니다.

다만 때에 따라서 N+2를 해야되는 경우도 생기고, N+100도 필요할 때가 있더라고요. 그런데 시험장에서 N+2인지 N+100인지를 의심하고 문제를 확인하기 까지는 시간이 꽤나 오래 걸리고, 실제로 이것 때문에 떨어지는 경우가 종종 발생하기 때문에, 그냥 문제에서 나오는 가능한 최댓값으로 시작하는 것이 가성비 좋은(?) 해결책이라 이렇게 작성하고 추천드리고 있습니다.

그런데 찬혁님께서 가능하시다면, 더 최적화 된 답변을 제출하는 게 당연히 더 좋은 코드이고 정답이 됩니다!

0

choihyeok

앗 제가 강의를 헷갈렸습니다 Collections.reverseOrder()에는 문제가 없습니다!

0

gaebaljob

앗 네네! 저도 혹시나 틀렸나 해서 제출해봤는데 정답이 잘 나오는 것 같아요 :)

0

communityai8509

안녕하세요, 인프런 AI 인턴입니다.

최찬혁님의 질문에 대해 유사한 상황을 해결한 기존 답변을 참고하기 위해 관련된 정보를 찾아보았습니다. 다음 링크에서 비슷한 문제 상황에 대한 해결책을 제공하고 있습니다:

이 링크의 내용은 백준 문제 풀이에서 정렬 관련 궁금증에 대해 설명되어 있습니다. 특히, Collections.sort()Arrays.sort() 의 사용법 및 차이점에 대해 설명하고 있으며, 문제 풀이에서 정렬 방식의 선택 기준에 대해서도 언급하고 있습니다. 이 내용은 질문 내용 중 정렬 방식에 대한 궁금증에 도움이 될 수 있을 것입니다.

질문에서 언급한 Collections.reverseOrder() 사용에 대한 의문은 정렬 방식에 대한 선택과 관련이 있습니다. 일반적으로 Collections.sort()를 사용할 때는 오름차순 정렬이 기본입니다. 만약 내림차순 정렬이 필요한 경우 Collections.reverseOrder()를 인자로 전달하여 내림차순으로 정렬할 수 있습니다. 문제의 조건이 내림차순 정렬을 요구하는지, 아니면 상황에 맞게 오름차순 정렬이 적합한지 확인이 필요할 것입니다.

MAX를 사용하여 graph, visited, answer 배열의 크기를 정하는 부분은 백준과 같은 온라인 저지 시스템에서 특정한 최대 값으로 배열을 초기화하는 것이 일반적인 관행 중 하나입니다. 여기서 MAX값을 사용하는 것은 주어진 문제의 최대 범위를 안전하게 커버하기 위한 것입니다. 그러나 최찬혁님께서 언급하신대로 N+1로도 충분히 가능하다는 점에서, 실제 필요한 배열의 크기와 메모리 효율성을 고려하여 수정할 수 있습니다.

저는 질문자님의 이해를 돕고자 지식공유자님의 기존 답변을 참고하여 유사한 답변 링크를 추천해드리고 있습니다.
현재 베타 기능으로 답변이 만족스럽지 않을 수 있는 점 양해 부탁드립니다. 🙏
추가적으로 궁금한 점이 있으시면, 이어서 질문해 주세요. 곧 지식공유자께서 답변해 주실 것입니다.

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

1

74

1

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

1

96

2

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

1

64

2

graph 채울때 for문 설계 질문

1

73

2

질문있습니다.

1

74

1

다른 강의 언제나오나용?

1

94

2

노드간 거리 계산

1

146

1

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

1

130

1

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

1

143

1

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

0

134

2

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

1

120

1

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

1

250

3

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

1

202

2

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

1

224

1

촌수 계산

1

354

3

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

1

267

1

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

1

383

1

백준 실행시 틀립니다.

1

373

1

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

1

410

1

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

1

372

1

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

2

316

1

출력할 때 BufferedWriter? StringBuilder?

1

512

1

answer++ 위치 질문

1

257

1

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

1

272

1