Skip to content

[유병규-15주차 알고리즘 스터디] #72

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 3 commits into
base: main
Choose a base branch
from

Conversation

Gyulguma
Copy link

@Gyulguma Gyulguma commented May 5, 2025

🚀 싸피 15반 알고리즘 스터디 15주차 [유병규]

📌 문제 풀이 개요

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

✅ 문제 해결 여부

  • 개똥벌레
  • 흙길 보수하기
  • 어항 정리
  • 단어 암기
  • 인터넷 설치

  • 등산
  • 로마 숫자
  • 방탈출

💡 풀이 방법

문제 1: 개똥벌레

문제 난이도

  • 골드 5

문제 유형

  • 이분 탐색, 누적 합

접근 방식 및 풀이

  • 높이가 H인 동굴에서 각 높이 h별 통과하는 장애물의 개수를 저장하는 배열을 생성하여 문제를 해결하였습니다.

  • 처음에는 이 배열을 생성할 때 단순히 모든 장애물에 대해 각 높이에 해당하면 +1 을 하는 방식으로 구현하였습니다. 하지만 이러한 방식은 $O(N*H)$의 시간복잡도를 가져 시간 초과가 났습니다. 그래서 누적합으로 접근하였습니다.

  • 먼저 각 장애물에 대한 높이 변화량을 저장하는 배열을 생성합니다. 이때 장애물이 시작하는 지점에 +1 , 장애물이 끝나는 지점 바로 다음에 -1 을 해줌으로써 장애물의 변화량만 표시합니다.

  • 이제 변화량을 저장한 배열을 통해 최종적으로 누적합 배열을 생성합니다. 누적합 배열은 다음과 같은 점화식을 가집니다.

    • sum[i] = sum[i-1] + diff[i]
  • 예시

    예를 들어, 높이가 3인 석순이 있다고 가정해 보겠습니다

    • 이 석순은 높이 1, 2, 3에 영향을 미칩니다.
    • 모든 높이를 직접 순회하는 대신, 다음과 같이 표시합니다:
      • diff[1] += 1 (석순이 시작하는 높이)
      • diff[3+1] -= 1 (석순이 끝나는 높이 바로 다음)

    이렇게 하면 높이 배열 diff는 [0, 1, 0, 0, -1, 0, ...] 같은 형태가 됩니다.

    이제 누적합을 계산하면:

    • sum[1] = diff[1] = 1
    • sum[2] = sum[1] + diff[2] = 1 + 0 = 1
    • sum[3] = sum[2] + diff[3] = 1 + 0 = 1
    • sum[4] = sum[3] + diff[4] = 1 + (-1) = 0
    • sum[5] = sum[4] + diff[5] = 0 + 0 = 0

    결과적으로 sum 배열은 [0, 1, 1, 1, 0, 0, ...] 형태가 되며, 이는 각 높이에서의 장애물 개수를 나타냅니다.

  • 이 누적합 배열을 통해 각 높이에 대한 장애물의 개수를 구할 수 있고 이때 최솟값과 그 구간의 개수를 구하는 것이기에 정렬 후 최종 답을 구했습니다. 위 방법으로 구할 경우 $O(N+H)$의 시간 복잡도를 가지게 됩니다.


문제 2: 흙길 보수하기

문제 난이도

  • 골드 5

문제 유형

  • 그리디, 정렬, 스위핑

접근 방식 및 풀이

  • 웅덩이 위치를 시작 위치를 기준으로 정렬을 한 후 처음부터 널빤지를 놓으며 진행했습니다. 만약 한 웅덩이 채우면서 놓았던 널빤지가 다음 웅덩이를 침범했다면 그냥 이어서 널빤지를 놓는 식으로 문제를 해결하였습니다.

문제 3: 어항 정리

문제 난이도

  • 플레티넘 5

문제 유형

접근 방식 및 풀이


문제 4: 단어 암기

문제 난이도

  • 골드 4

문제 유형

  • 브루트포스, 비트마스킹

접근 방식 및 풀이

  • 알파벳의 개수가 30보다 작고, 기억하는 단어의 종류가 변할 때마다 비교 연산을 해야 하기에 빠른 연산을 위해 비트 마스킹을 사용하였습니다.
  • 먼저 각 단어를 a~z까지의 알파벳 중 해당 단어가 포함하는 알파벳의 위치에 1을 아니면 0을 표시하여 정수로 표현하였습니다.
  • 그리고 현재 알고 있는 알파벳을 비트 마스킹을 통해 하나의 정수로 관리하고 M번의 연산 동안 변화하는 단어의 종류를 해당 정수에 저장한 후 모든 단어와 비교하는 방법으로 문제를 해결하였습니다.

문제 5: 인터넷 설치

문제 난이도

  • 골드 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