Skip to content

[권혁준-11주차 알고리즘 스터디] #57

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

Conversation

oncsr
Copy link
Contributor

@oncsr oncsr commented Apr 4, 2025

🚀 싸피 15반 알고리즘 스터디 11주차 [권혁준]

📌 문제 풀이 개요

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

✅ 문제 해결 여부

  • 직사각형으로 나누기
  • 경로 찾기
  • 컨베이어 벨트 위의 로봇
  • 이중 우선순위 큐
  • 구간 나누기 2

  • 도로검문
  • 팰린드롬 분할
  • 복제 로봇

💡 풀이 방법

문제 1: 직사각형으로 나누기

문제 난이도

Gold 4

문제 유형

  • 누적 합
  • 완탐

접근 방식 및 풀이

모든 칸이 한 번씩 포함되어야 하니까, 존재하는 직사각형 배치를 모두 고려해주는 방법으로 해결했습니다.
직사각형의 배치마다 합을 빠르게 구해주기 위해, 누적 합으로 전처리 해줬습니다.

배치의 경우의 수가 생각보다 많은데, 대부분 예제를 보면 알 수 있었습니다.

답의 최댓값이 2^31 이상인데, long 자료형을 쓰지 않아서 한 번 틀렸습니다.


문제 2: 경로 찾기

문제 난이도

Gold 4

문제 유형

  • BFS

접근 방식 및 풀이

N^2으로 모든 코드 번호 사이에 간선 존재 여부를 파악해서 인접 행렬 방식으로 저장했습니다.
이후엔 일반적인 BFS를 돌리고, 역추적을 위해 각 코드 번호 별로 부모 번호를 저장했습니다.


문제 3: 컨베이어 벨트 위의 로봇

문제 난이도

Gold 5

문제 유형

  • 시뮬레이션

접근 방식 및 풀이

image
이 양식에 맞춰서 각 단계 별로 코드를 작성했습니다.

각 칸의 내구도를 N*2 길이의 배열에, 그리고 로봇의 위치는 List 형태로 관리했습니다.

로봇을 한 칸 앞으로 옮길 때, 옮길 수 없는 로봇을 폐기 처분해놓고 예제 답이 나오지 않아 한참 헤맸습니다..


문제 4: 이중 우선순위 큐

문제 난이도

Gold 4

문제 유형

  • TreeMap

접근 방식 및 풀이

원소들이 모두 정렬된 상태를 유지할 수 있다면, 주어지는 'D'연산을 모두 양 끝 원소 삭제로 대체할 수 있습니다.
이 조건을 만족하는 자료구조로 multiset을 떠올렸습니다.

하지만 Java는 multiset을 따로 지원하지 않아서, TreeMap을 이용해 multiset을 흉내내어 풀었습니다.
key값을 원소, value를 빈도로 설정하고 구현했습니다.


문제 5: 구간 나누기 2

문제 난이도

Gold 4

문제 유형

  • 매개 변수 탐색

접근 방식 및 풀이

처음엔 DP로 접근했습니다.
dp[n][k] = n번째 원소까지만 사용해서 구간을 k개 만들었을 때의 점수 최댓값 중 최솟값
이렇게 식을 세우니, $O(N^2M)$으로 제한 시간안에 절대 풀 수가 없었습니다.

그 후로, 이 문제를 결정 문제로 바꿔서 바라봤습니다.
구간의 점수의 최댓값의 최솟값이 k가 되도록 할 수 있을까?
-> 이 결정 문제를 해결하는 것은 $O(N)$에 할 수 있었습니다.

위의 k값을 단순히 0부터 차례대로 다 확인해주는 방식으로 해결했습니다.


문제 6: 도로검문

문제 난이도

Gold 1

문제 유형

  • 다익스트라

접근 방식 및 풀이

초기 그래프에서 다익스트라를 한 번 돌려서 최단 경로를 구했습니다.
그리고, 간선을 직접 그래프에서 하나씩 제거하며 매번 다익스트라르 다시 돌려서 그 중 최댓값을 구했습니다.

두 값을 비교해서 정답을 판별했습니다.

Trouble Shooting

알맞게 잘 짠 것 같은데 계속 메모리 초과가 발생했습니다.
그래프를 인접 리스트 방식으로 구현해서 생긴 문제인가 싶어, 인접 행렬 방식으로 바꾸어 제출했더니 시간 초과가 발생했습니다.

-> 인접 리스트 방식으로 구현하되, 간선 클래스를 직접 구현하고 모든 변수들을 전역으로 빼주니 아슬아슬하게 통과했습니다.


문제 7: 팰린드롬 분할

문제 난이도

Gold 1

문제 유형

  • DP

접근 방식 및 풀이

간단한 dp식을 떠올렸습니다.
dp[i] = i번째 문자까지만 고려했을 때, 팰린드롬 분할의 최소 개수

이 식은 유사 O(N^2)로 적용시킬 수 있습니다.
$dp[i] = \max(dp[j-1] + 1)$ (단, j ~ i까지가 팰린드롬이어야 함)

특정 범위의 팰린드롬 여부를 O(1)에 구할 수 있다면, 위 dp식으로 문제를 해결할 수 있습니다.

팰린드롬의 중심점을 하나 잡는 데 O(N)이고, 이를 중심으로 양 옆으로 뻗어나가며 팰린드롬 체크하는데 O(N)입니다.
-> O(N^2)으로 모든 범위에서의 팰린드롬 여부를 전처리할 수 있습니다.


문제 8: 복제 로봇

문제 난이도

Gold 1

문제 유형

  • 최소 스패닝 트리
  • BFS

접근 방식 및 풀이

'S', 'K'인 칸에서만 로봇을 복제할 수 있다는 조건에서, 최적의 값은 항상 MST의 형태를 이룬다는 것을 캐치했습니다.

MST를 캐치하고 난 뒤, 주어진 격자를 그래프화 해줬습니다.
모든 'S', 'K'끼리의 최단 거리를 간선으로 삼아 크루스칼 알고리즘을 돌려 답을 구했습니다.


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