경로 찾기 11403

LJM·2023년 2월 20일
0

백준풀기

목록 보기
105/259

https://www.acmicpc.net/problem/11403

문제가 이해하는데 좀 어렵기는 했다 "모든 정점 (i, j)에 대해서" 이문장에서 정점의 개념과 (i,j를 원소로 갖는) "정점의 개수 N" 문장에서 정점의 개념(1, 2, 3등의 숫자) 이 다른데 정점이라고 설명하다보니 헷갈리게 만든다.

위의 예제 같은 경우를 보자
3개의 노드가 있다. 1, 2, 3 이다

위의 행렬을 보자 행과 열의 인덱스는 다음과 같다
1,1 1,2 1,3
2,1 2,2 2,3
3,1 3,2 3,2

1,2 2,3 3,1 3개의 정점은 값이 1이므로 i노드에서 j노드로 연결된다는 뜻이다 다음과 같이 그릴 수 있다

순환이기 때문에 어디서 출발하든 어디든지 갈 수 있으므로
출력은
1 1 1
1 1 1
1 1 1
이다

ArrayList 이차원으로 연결관계를 저장하고

N X N 을 for문으로 돌면서
i행에서 j열로 연결되어 있는지
DFS 와 Stack 컬렉션을 사용해서 답을 구하고
true 면 1 false면 0을 출력하도록 해서 해결하였다

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

public class Main
{
    public static void main(String[] args) throws IOException
    {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));

        int N = Integer.parseInt(br.readLine());

        ArrayList<ArrayList<Integer>> graph = new ArrayList<>();
        for(int i = 0; i <= N; ++i)
        {
            graph.add(new ArrayList<>());
        }

        String[] input;
        for(int i = 1; i <= N; ++i)
        {
            input = br.readLine().split(" ");
            for(int j = 1; j <= N; ++j)
            {
                int num = Integer.parseInt(input[j-1]);
                if(num == 1)
                    graph.get(i).add(j);
            }
        }

        StringBuilder sb = new StringBuilder();
        for(int i = 1; i <= N; ++i)
        {
            for(int j = 1; j <= N; ++j)
            {
                if(dfs(i, j, graph, N))
                {
                    if(j == N)
                        sb.append(1);
                    else
                        sb.append(1 + " ");
                }
                else
                {
                    if(j == N)
                        sb.append(0);
                    else
                        sb.append(0 + " ");
                }

                if(j == N)
                    sb.append("\n");
            }
        }

        System.out.println(sb);
    }

    private static boolean dfs(int i, int j, ArrayList<ArrayList<Integer>> graph, int n)
    {
        Stack<Integer> stack = new Stack<>();

        stack.push(i);
        boolean[] visit = new boolean[n+1];
        visit[i] = true;

        while(stack.isEmpty() == false)
        {
            int cur = stack.peek();
            ArrayList<Integer> curNode = graph.get(cur);
            boolean noGo = true;
            for(int k = 0; k < curNode.size(); ++k)
            {
                int adj = curNode.get(k);
                if(adj == j)
                    return true;

                if(visit[adj] == true)
                    continue;

                stack.add(adj);
                visit[adj] = true;
                noGo = false;
                break;
            }

            if(noGo)
                stack.pop();
        }

        return false;
    }
}
profile
게임개발자 백엔드개발자

0개의 댓글