Skip to content

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

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/week9
Choose a base branch
from

Conversation

minseojeong1012
Copy link
Contributor

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

📌 문제 풀이 개요

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

✅ 문제 해결 여부

  • 문제 1 : 유기농 배추
  • 문제 2 : DFS와 BFS
  • 문제 3 : 숨바꼭질
  • 문제 4 : 적록색약
  • 문제 5 : 플로이드

💡 풀이 방법

문제 1: 유기농 배추

문제 난이도
실버 2

문제 유형
그래프

접근 방식 및 풀이

dx, dy를 사용해 상하좌우 값을 조회하였고, dfs를 사용하고 배추가 아직 있고 방문하지 않은 경우에만 재귀를 해서 count 값을 갱신하였다.

   static void dfs(int x, int y) {
        visited[x][y] = true;

        for (int i = 0; i < 4; i++) {
            int nx = x + dx[i];
            int ny = y + dy[i];
            if (nx >= 0 && ny >= 0 && nx < m && ny < n) {
                //배추가 아직 있고 방문하지 않은 경우에만
                if (map[nx][ny] == 1 && !visited[nx][ny]) {
                    dfs(nx, ny);
                }
            }
        }
    }

문제 2: DFS와 BFS

문제 유형
그래

문제 난이도
실버 2

접근 방식 및 풀이

주어지는 간선이 서로 연결되어 있기 때문에 어레이 리스트를 사용하여 값들을 관리해서 문제를 풀었습니다

tree = new ArrayList[n + 1];
        for (int i = 1; i <= n; i++) {
            tree[i] = new ArrayList<>();
        }

        for (int i = 0; i < n - 1; i++) {
            StringTokenizer st = new StringTokenizer(br.readLine());
            int a = Integer.parseInt(st.nextToken());
            int b = Integer.parseInt(st.nextToken());
            tree[a].add(b);
            tree[b].add(a);
        }

문제 3: 숨바꼭질

문제 유형
그래프

문제 난이도
실버 1

접근 방식 및 풀이

bfs를 사용해서 거리를 기록했습니다. 문제에서 제시한 대로 -1, +1, *2 이 세가지 가능한 이동이 있었기 때문에 int 배열로 관리해서 문제를 해결했습니다.

        while(!queue.isEmpty()){
            int cur = queue.poll();
            if(cur == K){
                System.out.println(dist[cur]);
                return;
            }

            // 가능한 이동: -1, +1, *2
            int[] nextPositions = {cur - 1, cur + 1, cur * 2};
            for (int next : nextPositions) {
                if(next >= 0 && next <= MAX && dist[next] == -1){
                    dist[next] = dist[cur] + 1;
                    queue.add(next);
                }
            }
        }

문제 4: 적록색약

문제 유형
그래프

문제 난이도
골드 5

접근 방식 및 풀이

원본 격자를 복사해서 gridForColorblin 배열을 만든 후, G를 R 로 변경했습니다
이 격자를 사용해서 DFS로 영역을 계산 후 일반인의 영역 수와 적록색약의 영역 수를 공백으로 구분하여 출력하였습니다.

    // (x, y) 위치에서 시작하여 color와 같은 영역을 탐색
    static void dfs(int x, int y, char color) {
        visited[x][y] = true;
        for (int i = 0; i < 4; i++) {
            int nx = x + dx[i];
            int ny = y + dy[i];
            // 격자 범위 내에 있는지 확인
            if (nx >= 0 && nx < N && ny >= 0 && ny < N) {
                // 아직 방문하지 않았고, 색이 동일하면 DFS 진행
                if (!visited[nx][ny] && grid[nx][ny] == color) {
                    dfs(nx, ny, color);
                }
            }
        }
    }

문제 5: 플로이드

문제 유형
그래프

문제 난이도
골드 4

접근 방식 및 풀이

배열의 모든 값을 가장 큰값으로 초기화 하고, 자기 자신으로 가는 거리는 0으로 초기화

중간 정점인 k를 1부터 n 까지 순회하면서
dist[i][j]=min(dist[i][j],dist[i][k]+dist[k][j]) 로 업데이트

그 후 i 에서 j로 갈 수 없는 경우는 0을 출력 -> 무한대로 남아있기 때문에
나머지는 계산된 최단거리를 출력

        // 3. 플로이드–워셜 알고리즘 수행
        for (int k = 1; k <= n; k++) {
            for (int i = 1; i <= n; i++) {
                for (int j = 1; j <= n; j++) {
                    if (dist[i][j] > dist[i][k] + dist[k][j]) {
                        dist[i][j] = dist[i][k] + dist[k][j];
                    }
                }
            }
        }

        // 4. 결과 출력: 경로가 없으면 0을 출력
        BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));
        StringBuilder sb = new StringBuilder();
        for (int i = 1; i <= n; i++) {
            for (int j = 1; j <= n; j++) {
                sb.append((dist[i][j] == INF ? 0 : dist[i][j])).append(" ");
            }
            sb.append("\n");
        }

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