codingtest

부대복귀

2025-10-13
1분 분량
JAVA프로그래머스

문제 링크

문제 풀이 시간 : 15분

문제 요약

  • 지도에는 1부터 n까지 번호가 붙은 지역이 존재하며, 각 지역은 양방향 도로(roads) 로 연결되어 있음
  • 각 도로는 통과하는 데 걸리는 시간이 모두 1로 동일함
  • 강철부대 본부가 위치한 지역 번호는 destination
  • 여러 명의 부대원이 각각 다른 지역(sources)에서 복귀하려고 함
  • 부대원은 최단 시간으로 destination으로 복귀하려 하지만,
  • 복귀가 불가능한 경우에는 1을 반환해야 함

문제 풀이

이 문제는 예전에 스터디에서 진행했던 모의 코테에서 출제되었던 문제였다.

그때는 꽤나 어렵게 풀었고, 결국 못 풀었었다.

오늘 프로그래머스 추천 문제에서 이 문제가 나와서 이번에 다시 풀어보게 되었다.

처음에는 전처럼 꽤나 어려운 방식으로 접근을 하려고 했는데,

잠깐 생각해보니 그냥 destination에서 모든 가능한 경로를 미리 계산해두면 빠르게 풀 수 있는 아주 쉬운 문제였다..!

최종 코드

java
import java.util.*;

class Solution {
    public List<Integer>[] arr;
    
    public int[] solution(int n, int[][] roads, int[] sources, int destination) {
        int[] dist = new int[n+1];
        
        arr = new ArrayList[n+1];
        for(int i=1;i<=n;i++)
            arr[i] = new ArrayList<>();
        
        //양방향 그래프 생성
        for(int i=0;i<roads.length;i++){
            arr[roads[i][0]].add(roads[i][1]);
            arr[roads[i][1]].add(roads[i][0]);
        }
        
        //거리 배열 -1 초기화
        Arrays.fill(dist,-1);
        dist[destination] = 0;
        Queue<Integer> q = new LinkedList<>();
        q.add(destination);
        
        //bfs 탐색
        while(q.size()!=0){
            int now = q.poll();
            for(int next : arr[now]){
                if(dist[next]!=-1)
                    continue;
                q.add(next);
                dist[next] = dist[now]+1;
            }
        }
        
        //각 출발지에서 목적지까지 거리 가져오기
        int[] answer = new int[sources.length];
        for(int i=0;i<sources.length;i++){
            answer[i] = dist[sources[i]];
        }
        
        return answer;
    }
}

함께 읽으면 좋은 글

코딩 테스트2026-08-23

택배상자

order 배열은 택배 기사님이 원하는 상자 적재 순서다 기존 컨테이너 벨트는 1번부터 순서대로만 꺼낼 수 있다 보조 벨트는 스택처럼 마지막에 넣은 것부터 꺼낼 수 있다 원하는 순서대로 최대한 실을 수 있는 상자 개수를 구하는 문제다 처음에는 기존 벨트를 실제 리스트로 만들어…

코딩 테스트2026-08-23

롤케이크 자르기

topping 배열은 롤케이크에 일렬로 올라간 토핑 번호다 한 지점을 잘라 두 조각으로 나눴을 때, 양쪽 토핑 종류 수가 같아야 공평하게 나눈 것이다 공평하게 자를 수 있는 방법의 수를 구하는 문제다 처음에는 자르는 위치마다 왼쪽과 오른쪽 배열을 나눠서 각각 서로 다른 토핑…

코딩 테스트2026-08-23

할인 행사

want, number 배열로 정현이가 원하는 제품과 수량을 표현한다 discount 배열은 XYZ 마트가 매일 할인하는 제품 목록이다 연속된 10일 동안 할인 제품 종류와 수량이 want, number와 정확히 일치해야 회원가입할 수 있다 그런 시작일이 총 몇 번 있는지…

코딩 테스트2026-08-23

숫자 변환하기

자연수 x를 y로 바꾸는 데 x+n, x2, x3 세 가지 연산을 쓸 수 있다 x를 y로 바꾸는 최소 연산 횟수를 구하는 문제다 만들 수 없으면 -1을 반환한다 처음에는 x에서 시작해서 세 가지 연산을 재귀적으로 다 시도해보고 y에 도달하는 경로 중 가장 짧은 걸 고르면…