inflearn logo
강의

강의

N
챌린지

챌린지

멘토링

멘토링

N
클립

클립

로드맵

로드맵

지식공유

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

알고리즘 수업 - 깊이 우선 탐색 1 (백준 24479)

백준 사이트

608

김학준
1

  1. 원래는 프로그래머스에서만 풀다가 이번에 처음 백준 사이트를 이용하는 중입니다. 프로그래머스와 달리 테스트 케이스 테스트 해보기도 너무 어렵고 실수한 곳을 찾아내기가 너무 어려운데 혹시 추천하는 방법 있으신가요?

  2. 혹시 코드 답은 따로 안 올려주시나요? 강의 페이지에 한번에 들어오지 않아 일일이 비교해가면서 정답을 맞추기 어렵습니다.

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

답변 1

1

개발자로 취직하기

김학준님 안녕하세요 🙂

  1. 맞아요 백준은 어떤 테스트 케이스에서 틀렸는지 알려주지 않기 때문에 어려운데, 그만큼 실전에 가까워서 실전 연습을 시켜주는데 도움이 되는 것 같아요. 초반에는 이렇게 하시는 게 어렵기 때문에 답을 알려주는 프로그래머스나 정올에서 풀어보시는 것도 좋은데, 어느 정도 문제에 익숙해져서 실전 모의고사를 하려면 백준을 추천드려요.

     

    그리고 백준에서 틀렸지만 왜 틀렸는지 모를 때는 여러 테스트 케이스를 만들어보며 확인하는 것도 연습해보시면 좋습니다. 결국 실제 시험 보러가셔서 테스트케이스가 정답이 안 나오거나, 간단한 건 통과했는데 제출하면 틀린 경우에 어떤 경우가 잘못됐는지 확인이 필요합니다.

이때 확인하는 방법은 주어진 테스트 케이스에서 값을 하나씩만 바꿔서 기존 답안에서 쉽게 계산할 수 있는 예제를 만들어야 해요. 안 그러면 내가 만든 테스트케이스를 계산하다가 시간을 다 낭비하게 됩니다. 그리고 테스트 케이스는 최대한 극단의 값을 확인하는 게 좋습니다. N이 1~ 1000 이 들어올 수 있다면 1과 1000, 0 과 1001 등 경계에 있는 테스트케이스에서 오동작하는 경우가 많습니다.

이런 식으로 문제가 될법한 테스트케이스를 빨리 찾는 것도 코딩테스트를 합격하는데 중요하니 백준에서 조금씩 연습해보셔도 좋을 것 같아요!

  1. 제가 코드 답안을 따로 안 올렸네요! 우선 이 문제에 대한 답변은 지금 바로 올려드리고, 나머지는 이번 주 내로 답안 올려놓을게요! 조금만 기다려 주세요 🙂

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

class Main {
    final static int MAX = 1000000 + 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++)
            if (!visited[graph[idx].get(i)])
                dfs(graph[idx].get(i));
    }

    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[y].add(x);
            graph[x].add(y);
        }

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

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

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

방산 SW 개발자가 되기 위한 조언을 부탁드립니다!

0

51

0

JAVA로 백엔드 프로젝트

0

54

1

고민이있습니다...!

0

85

3

26년1회 실기 합격할수 있을까??ㅠㅠ

0

170

1

백준 서비스 종료

0

269

1

재귀함수 코드를 작성하는 단계가 어렵습니다.

0

220

0

자바 실무 단계

0

305

2

진로가 큰 걱정입니다...

0

293

1

강의에 나오는 알고리즘이 코테에 많이 나오는건가요?

0

350

0

공부 방향

0

315

1

구현 유형 추천문제

0

318

1

안녕하세요! 실무와 관련되서 질문드립니다!

0

329

1