Skip to content

Conversation

@ksinji
Copy link
Contributor

@ksinji ksinji commented Apr 6, 2025

🚀 싸피 15반 알고리즘 스터디 10주차 [강신지]

📌 문제 풀이 개요

  • 이번 PR에서는 다음 5문제의 풀이를 포함합니다.
  • 각 문제에 대한 풀이 과정과 접근 방식을 설명합니다.

✅ 문제 해결 여부

  • 문제 1
  • 문제 2
  • 문제 3
  • 문제 4
  • 문제 5

💡 풀이 방법

문제 1: 최소 스패닝 트리

문제 난이도
골드 4

문제 유형
그래프

접근 방식 및 풀이
MST를 구하는 문제입니다.
간선의 가중치를 오름차순 정렬한 후, 사이클 검사를 위해 union-find를 활용하여 크루스칼 알고리즘을 적용했습니다.

    public static int find(int a) {
        if (parent[a] != a) {
            parent[a] = find(parent[a]);
        }
        return parent[a];
    }
    
    public static boolean union(int a, int b) {
        int rootA = find(a);
        int rootB = find(b);
        if (rootA == rootB) return false;
        parent[rootB] = rootA;
        return true;
    }

문제 2: 파티

문제 난이도
골드 4

문제 유형
그래프

접근 방식 및 풀이
파티 장소로부터 각 학생의 집까지 왕복하는 최단 경로 중 가장 긴 시간을 구하는 문제입니다.
파티 장소 -> 집, 집 -> 파티 장소 두 가지의 경우에 다익스트라 알고리즘을 각각 사용하여 계산했습니다.

        // X에서 각 정점까지 최단 경로
        int[] distFromX = dijkstra(X, graph, N);
        // 각 정점에서 x로 가는 최단 경로
        int[] distToX = dijkstra(X, revGraph, N);
        
        // 모든 정점에 대해 왕복 시간의 최댓값 계산
        int maxTime = 0;
        for (int i = 1; i <= N; i++) {
            maxTime = Math.max(maxTime, distFromX[i] + distToX[i]);
        }

문제 3: 쉬운 최단거리

문제 난이도
실버 1

문제 유형
그래프

접근 방식 및 풀이
각 지점에서 목표 지점까지의 최소 거리를 구하는 문제입니다.
BFS를 사용해 계산했습니다.

    static void bfs() {
        Queue<int[]> q = new LinkedList<>();
        q.offer(new int[] {startX, startY});
        result[startX][startY] = 0;
        visited[startX][startY] = true;
        
        while (!q.isEmpty()) {
            int[] current = q.poll();
            for (int i = 0; i < 4; i++) {
                int x = current[0] + dx[i];
                int y = current[1] + dy[i];
                if (!isOk(x, y) || visited[x][y]) continue;
                visited[x][y] = true;
                result[x][y] = result[current[0]][current[1]] + 1;
                q.offer(new int[] {x, y});
            }
        }
    }

문제 4: 경로찾기

문제 난이도
실버 1

문제 유형
그래프

접근 방식 및 풀이
주어진 인접행렬을 이용해 각 정점에서 다른 정점으로 이동 가능한지 확인하는 문제입니다.
각 정점에서 시작해 BFS를 진행하며 도달 가능한 노드를 탐색했습니다.

        for (int i = 0; i < N; i++) {
            boolean[] visited = new boolean[N];
            Queue<Integer> q = new LinkedList<>();
            q.add(i);
            
            while (!q.isEmpty()) {
                int current = q.poll();
                
                for (int j = 0; j < N; j++) {
                    if (visited[j] || graph[current][j] == 0) continue;
                    visited[j] = true;
                    q.add(j);
                    result[i][j] = 1;
                }
            }
        }

문제 5 : 뱀과 사다리 게임

문제 난이도
골드 5

문제 유형
그래프

접근 방식 및 풀이
사다리와 뱀이 존재하는 게임판에서 100번 칸에 도달하기까지 주사위를 굴리는 최소 횟수를 구하는 문제입니다.
BFS를 사용하여 현재 위치에서 주사위 1~6의 모든 경우의 수를 고려, 사다리나 뱀이 있는 경우 해당 위치로 이동하며 최단 이동 횟수를 계산합니다.

	Queue<int[]> q = new LinkedList<>();
        q.add(new int[] {1, 0});
        visited[1] = true;
        
        while (!q.isEmpty()) {
            int[] current = q.poll();
            
            if (current[0] == 100) {
                System.out.println(current[1]);
                return;
            }
            
            for (int i = 1; i <= 6; i++) {
                int next = current[0] + i;
                if (next > 100 || visited[next]) continue;
                if (move[next] != 0) {
                    next = move[next];
                }
                q.add(new int[] {next, current[1] + 1});
                visited[next] = true;
            }
        }

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant