프로그래머스(가장 먼 노드, LV3)

2025. 4. 19. 20:47·알고리즘

문제 내용

문제 설명
입출력 예시


제출한 코드

import java.util.*;

public class Solution {

    static ArrayList<Integer>[] list;
    static int[] visited;
    static int max = 0;

    public int solution(int n, int[][] edge) {
        initData(n, edge);
        return getAnswer();
    }

    private void initData(int n, int[][] edge) {
        list = new ArrayList[n + 1];
        visited = new int[n + 1];
        max = 0;

        for (int i = 0; i < list.length; i++) {
            list[i] = new ArrayList<>();
        }

        for (int[] arr : edge) {
            int node1 = arr[0];
            int node2 = arr[1];

            list[node1].add(node2);
            list[node2].add(node1);
        }
    }

    private int getAnswer() {
        int answer = 0;
        bfs(1, 1);

        for (int i : visited) {
            if (i == max) {
                answer++;
            }
        }
        return answer;
    }

    private void bfs(int start, int count) {
        Queue<Integer> q = new LinkedList();
        q.add(start);
        q.add(count);
        visited[start] = count;

        while (!q.isEmpty()) {
            int node = q.poll();
            int n = q.poll();

            if (max < n) {
                max = n;
            }

            for (int i = 0; i < list[node].size(); i++) {
                int next = list[node].get(i);

                if (visited[next] != 0) {
                    continue;
                }

                visited[next] = n + 1;
                q.add(next);
                q.add(n + 1);
            }
        }
    }
    
}

후기

그래프 탐색 문제는 내가 3학년때 처음 알고리즘 강의를 수강했었을때 처음 접했었고, 오랜만에 풀어보는 문제였다
평소에 그래프 탐색 문제를 좀 더 연습하고 싶다고 생각만 가지고있다가 풀어봤던 문제다

 

위 입출력 예시에도 나와있듯이 1번 노드에서 가장 멀리 떨어진 노드의 개수를 구하라는 건데, 처음엔 단순히 거리가 먼 노드가 하나만 있을 거라 생각하긴 했었다. 예제에서도 마찬가지로 4, 5, 6처럼 여러 개가 나올 수 있다는 걸 보고 “최대 거리인 노드가 몇 개인지를 구하는 문제구나” 하고 접근했다

 

처음엔 재귀 DFS로 접근해볼까 했지만, 최단 경로를 기준으로 가장 먼 노드를 찾는 문제이기 때문에 알고리즘 시간에 배웠었던 BFS를 적용해서 풀이했다


추가적으로 학습한 내용

노드를 방문할 때마다 그 노드까지 걸린 “거리”를 기록해두고, 방문이 끝난 뒤 visited 배열에서 가장 큰 값 을 찾아주고 그 거리를 가진 노드의 개수를 세는 방식으로 풀었다

for (int i : visited) {
    if (i == max) answer++;
}

풀고나서 다른 사람들의 풀이를 보고 추가적으로 깨달은 내용도 있었는데, 나는 BFS에서는 (노드 번호, 거리) 를 같이 관리해야 해서 큐에 두 값을 번갈아 넣는 구조로 했었다. 근데 Pair나 Node 클래스를 적용하면 훨씬 간결하고 풀이 내용을 떠올리기도 쉬울거같아서 더 깔끔하게 풀이할 수 있을거같다는 생각이 들었다

 

시험기간이라 알고리즘에 소홀했었는데.... 시험 끝나고 다른 포스팅으로 다시 돌아오도록 하겠다

'알고리즘' 카테고리의 다른 글

백준(1300번, K번째 수, 골드I)  (0) 2025.04.03
백준(1253번, 좋다, 골드IV)  (3) 2025.03.07
백준(1193번, 분수찾기, 실버V)  (0) 2025.02.18
프로그래머스(입국심사, LV3)  (0) 2025.02.14
프로그래머스(오픈채팅방, LV2)  (1) 2025.02.12
'알고리즘' 카테고리의 다른 글
  • 백준(1300번, K번째 수, 골드I)
  • 백준(1253번, 좋다, 골드IV)
  • 백준(1193번, 분수찾기, 실버V)
  • 프로그래머스(입국심사, LV3)
huncozyboy
huncozyboy
이지훈
  • huncozyboy
    열정을 기록하기
    huncozyboy
  • 전체
    오늘
    어제
    • 분류 전체보기 (63)
      • Spring (26)
        • JWT (3)
        • 무한 스크롤 (1)
        • 매칭 로직 (2)
        • OAuth (4)
        • 자동화 (1)
        • 캐싱 (1)
        • AOP (2)
        • Swagger (1)
        • S3 (1)
        • CORS (1)
        • Spring Retry (0)
        • Webhook (2)
        • Grapheme Cluster (1)
        • 연관관계 (1)
        • CS 개념 (5)
      • DevOps (13)
        • 스왑 메모리 (1)
        • Blue Green (2)
        • Docker (7)
        • Route 53 (1)
        • 리버스 프록시 (2)
      • AI (2)
        • Claude Code (1)
        • Copilot (1)
      • CS (4)
        • JAVA (4)
      • Github (1)
        • Conflict (1)
      • Python (4)
        • Langchain (3)
        • Crawling (1)
      • 일상 (3)
        • 회고록 (1)
      • 알고리즘 (10)
        • 투포인터 (0)
        • 슬라이딩 윈도우 (0)
        • 정렬 (0)
        • 이분 탐색 (0)
  • 블로그 메뉴

    • 홈
    • 태그
    • 방명록
  • 링크

  • 공지사항

  • 인기 글

  • 태그

    OAuth
    aws
    java
    프로그래머스
    자바
    수도코드
    redis
    코딩테스트
    스프링
    코테
    JWT
    DevOps
    LangChain
    Spring
    Docker
    https
    알고리즘
    도커
    EC2
    백준
  • 최근 댓글

  • 최근 글

  • hELLO· Designed By정상우.v4.10.3
huncozyboy
프로그래머스(가장 먼 노드, LV3)
상단으로

티스토리툴바