Skip to content

[정민서-10주차 알고리즘 스터디] #12

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Open
wants to merge 50 commits into
base: minseojeong/week10
Choose a base branch
from

Conversation

minseojeong1012
Copy link
Contributor

🚀 싸피 15반 알고리즘 스터디 10주차 [정민서]

📌 문제 풀이 개요

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

✅ 문제 해결 여부

  • 문제 1 : 최소 스패닝 트리
  • 문제 2 : 파티
  • 문제 3 : 쉬운 최단거리
  • 문제 4 : 경로 찾기
  • 문제 5 : 뱀과 사다리 게임

💡 풀이 방법

문제 1: 최소 스패닝 트리

문제 난이도
골드 4

문제 유형
그래프

접근 방식 및 풀이

이번주에 배운 내용이라 어렵지 않게 풀었습니다. union 과 find 메서드를 활용하여 해결하였습니

	static boolean union(int a, int b) {
		int aRoot = find(a);
		int bRoot = find(b);
		
		if (aRoot == bRoot) {
			return false;
		}
		
		if (aRoot>bRoot) {
			parents[bRoot] = aRoot;
		} else {
			parents[aRoot] = bRoot;
		}
		return true;
	}
	
	static int find(int a) {
		
		if (a == parents[a]) {
			return a;
		}
		return parents[a] = find(parents[a]);
	}

문제 2: 파티

문제 유형
그래프

문제 난이도
골드 3

접근 방식 및 풀이

각 학생이 파티 장소 X로 가서 다시 돌아올 때 걸리는 최단 시간 중 가장 긴 시간을 구하는 문제기에 다익스트라 알고리즘을 활용하였습니다.

가중치를 고려하여 트리를 구현하고 x에서 각 정점으로 가는 최단 경로를 구하고, 간선의 방향을 반대로 해 각 정점에서 x로 가는 최단경로를 구하였습니다.

        // 그래프와 역방향 그래프 초기화
        List<Edge>[] graph = new ArrayList[n + 1];
        List<Edge>[] reverseGraph = new ArrayList[n + 1];
        for (int i = 1; i <= n; i++) {
            graph[i] = new ArrayList<>();
            reverseGraph[i] = new ArrayList<>();
        }

        for (int i = 0; i < m; i++) {
            st = new StringTokenizer(br.readLine());
            int u = Integer.parseInt(st.nextToken());
            int v = Integer.parseInt(st.nextToken());
            int w = Integer.parseInt(st.nextToken());
            // 정방향 그래프
            graph[u].add(new Edge(v, w));
            // 역방향 그래프 (각 간선의 방향을 반대로)
            reverseGraph[v].add(new Edge(u, w));
        }

        // X에서 각 노드로 가는 최단 경로 (X → i)
        int[] distFromX = dijkstra(x, graph, n);
        // 각 노드에서 X로 가는 최단 경로 (i → X)
        int[] distToX = dijkstra(x, reverseGraph, n);

문제 3: 쉬운 최단거리

문제 유형
그래프

문제 난이도
실버 1

접근 방식 및 풀이

최단거리를 구하는 문제이기에 bfs를 사용해서 거리를 기록했습니다. 0은 이동할 수 없는 칸이기에 예외상황을 두고 거리를 구했습니다

        while (!queue.isEmpty()){
            Point cur = queue.poll();
            for (int i = 0; i < 4; i++){
                int nr = cur.r + dr[i];
                int nc = cur.c + dc[i];
                if (nr < 0 || nr >= n || nc < 0 || nc >= m) continue;
                if (grid[nr][nc] == 0 || dist[nr][nc] != -1) continue;
                // 최단 거리 갱신 및 큐에 추가
                dist[nr][nc] = dist[cur.r][cur.c] + 1;
                queue.add(new Point(nr, nc));
            }
        }

문제 4: 경로찾기

문제 유형
그래프

문제 난이도
실버 1

접근 방식 및 풀이

플로이드 워셜 알고리즘을 사용하였습니다. k 를 거쳐 i에서 j로 갈수 있는 경로가 존재하는지 확인하고, 만약 graph[i][k] == 1 && graph[k][j] == 1 이라면 graph[i][j] = 1; 이렇게 갱신을 하여 반복문을 돌렸습니다.

        for (int k = 0; k < n; k++) {           // 중간 정점
            for (int i = 0; i < n; i++) {       // 시작 정점
                for (int j = 0; j < n; j++) {   // 도착 정점
                    // k를 거쳐서 i에서 j로 갈 수 있다면 경로 존재 표시
                    if (graph[i][k] == 1 && graph[k][j] == 1) {
                        graph[i][j] = 1;
                    }
                }
            }
        }

문제 5: 뱀과 사다리 게임

문제 유형
그래프

문제 난이도
골드 5

접근 방식 및 풀이

1번칸에서 100번 칸으로 가기 위한 최소 횟수이므로 bfs를 사용하였습니다.
주사위는 6가지의 경우의 수가 있기에 반복문을 돌리면서 시물레이션 하였습니다. 사다리나 뱀을 만나면 해당 위치로 이동하고, 이동횟수를 기록하였습니다.

             for (int dice = 1; dice <= 6; dice++) {
                int next = cur + dice;
                if (next > 100) continue; // 100번을 넘어가면 무시

                // 사다리나 뱀이 있는 경우 해당 위치로 이동
                next = board[next];

                // 아직 방문하지 않은 칸이라면
                if (moves[next] == -1) {
                    moves[next] = moves[cur] + 1;
                    queue.add(next);
                }
            }

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