Skip to content

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

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

Conversation

minseojeong1012
Copy link
Contributor

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

📌 문제 풀이 개요

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

✅ 문제 해결 여부

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

💡 풀이 방법

문제 1: 스티커

문제 난이도
실버 1

문제 유형
dp

접근 방식 및 풀이

스티커를 하나뜯으면 그 스티커와 인접한(대각선, 위., 아래) 스티커는 사용할 수없기에

윗줄 스티커를 선택했을 때 최대 점수와 아랫줄 스티커를 선택했을 때 최대 점수를 구분해서 dp로 구현했습니다.

           // DP 진행
            for (int j = 2; j <= n; j++) {
                dp[0][j] = Math.max(dp[1][j - 1], dp[1][j - 2]) + sticker[0][j];
                dp[1][j] = Math.max(dp[0][j - 1], dp[0][j - 2]) + sticker[1][j];
            }

문제 2: 곱셈

문제 유형
분할정복

문제 난이도
실버 1

접근 방식 및 풀이

분할정복을 통해서 거듭제곱 계산하였습니다
지수를 반으로 나누고, 짝수일 경우 반환, 홀수면 a를 한번 더 곱하는 방식으로 해결했습니다

    public static long calc(long a, long b, long c) {
        if (b == 1) {
            return a % c;
        }
        long half = calc(a, b / 2, c);
        half = (half * half) % c;
        
        if (b % 2 == 0) {
            return half;
        } else {
            return (half * a) % c;
        }
    }

문제 3: 벽 부수고 이동하기

문제 유형
그래프

문제 난이도
골드 3

접근 방식 및 풀이

일반적인 bfs로 진행하였습니다.
차별점은 벽을 부셨는지 여부를 확인해야 하므로 3차원 visited 배열로 상태를 관리하였습니다

                    // 다음 칸이 벽이고 아직 벽 안 부쉈으면
                    if (map[ny][nx] == 1 && now.breakWall == 0 && !visited[ny][nx][1]) {
                        visited[ny][nx][1] = true;
                        queue.offer(new Node(ny, nx, 1));
                    }

                    // 다음 칸이 빈 칸이고 아직 안 간 경우
                    if (map[ny][nx] == 0 && !visited[ny][nx][now.breakWall]) {
                        visited[ny][nx][now.breakWall] = true;
                        queue.offer(new Node(ny, nx, now.breakWall));
                    }
                }

문제 4: 웜홀

문제 유형
그래프

문제 난이도
골드 3

접근 방식 및 풀이

일반적인 bfs로는 음수를 확인할 수 없습니다. 따라서 벨만포드 알고리즘을 사용하여 음수 사이클을 관리하였습니다.

int[] dist = new int[N + 1];
        Arrays.fill(dist, 0); // 0으로 초기화해서 모든 정점에 대해 탐색

        for (int i = 1; i <= N; i++) {
            for (Edge edge : edges) {
                if (dist[edge.to] > dist[edge.from] + edge.weight) {
                    dist[edge.to] = dist[edge.from] + edge.weight;

                    if (i == N) {
                        return true; // N번째에도 갱신 → 음수 사이클 존재


문제 5: 숨바꼭질 3

문제 유형
그래프

문제 난이도
골드 5

접근 방식 및 풀이

이 문제는 0-1bfs 라는 개념을 사용해 해결했습니다. 일반적으로 bfs는 모든 가중치가 같을 때 사용하지만 0-1bfs는 가중치 값이 다릅니다.
따라서 덱을 활용하여 0은 앞쪽에 1은 뒤쪽에 추가하면서 가중치를 관리하였습니다.

            // 순간이동 (0초)
            if (now * 2 < MAX && dist[now * 2] == -1) {
                dist[now * 2] = dist[now];
                deque.offerFirst(now * 2);
            }

            // -1 이동 (1초)
            if (now - 1 >= 0 && dist[now - 1] == -1) {
                dist[now - 1] = dist[now] + 1;
                deque.offerLast(now - 1);
            }

            // +1 이동 (1초)
            if (now + 1 < MAX && dist[now + 1] == -1) {
                dist[now + 1] = dist[now] + 1;
                deque.offerLast(now + 1);
            }

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