[권혁준-11주차 알고리즘 스터디] #57
Open
Add this suggestion to a batch that can be applied as a single commit.
This suggestion is invalid because no changes were made to the code.
Suggestions cannot be applied while the pull request is closed.
Suggestions cannot be applied while viewing a subset of changes.
Only one suggestion per line can be applied in a batch.
Add this suggestion to a batch that can be applied as a single commit.
Applying suggestions on deleted lines is not supported.
You must change the existing code in this line in order to create a valid suggestion.
Outdated suggestions cannot be applied.
This suggestion has been applied or marked resolved.
Suggestions cannot be applied from pending reviews.
Suggestions cannot be applied on multi-line comments.
Suggestions cannot be applied while the pull request is queued to merge.
Suggestion cannot be applied right now. Please check back later.
🚀 싸피 15반 알고리즘 스터디 11주차 [권혁준]
📌 문제 풀이 개요
✅ 문제 해결 여부
💡 풀이 방법
문제 1: 직사각형으로 나누기
문제 난이도
Gold 4
문제 유형
접근 방식 및 풀이
모든 칸이 한 번씩 포함되어야 하니까, 존재하는 직사각형 배치를 모두 고려해주는 방법으로 해결했습니다.
직사각형의 배치마다 합을 빠르게 구해주기 위해, 누적 합으로 전처리 해줬습니다.
배치의 경우의 수가 생각보다 많은데, 대부분 예제를 보면 알 수 있었습니다.
답의 최댓값이 2^31 이상인데, long 자료형을 쓰지 않아서 한 번 틀렸습니다.
문제 2: 경로 찾기
문제 난이도
Gold 4
문제 유형
접근 방식 및 풀이
N^2으로 모든 코드 번호 사이에 간선 존재 여부를 파악해서 인접 행렬 방식으로 저장했습니다.
이후엔 일반적인 BFS를 돌리고, 역추적을 위해 각 코드 번호 별로 부모 번호를 저장했습니다.
문제 3: 컨베이어 벨트 위의 로봇
문제 난이도
Gold 5
문제 유형
접근 방식 및 풀이
이 양식에 맞춰서 각 단계 별로 코드를 작성했습니다.
각 칸의 내구도를 N*2 길이의 배열에, 그리고 로봇의 위치는 List 형태로 관리했습니다.
로봇을 한 칸 앞으로 옮길 때, 옮길 수 없는 로봇을 폐기 처분해놓고 예제 답이 나오지 않아 한참 헤맸습니다..
문제 4: 이중 우선순위 큐
문제 난이도
Gold 4
문제 유형
접근 방식 및 풀이
원소들이 모두 정렬된 상태를 유지할 수 있다면, 주어지는 'D'연산을 모두 양 끝 원소 삭제로 대체할 수 있습니다.
이 조건을 만족하는 자료구조로 multiset을 떠올렸습니다.
하지만 Java는 multiset을 따로 지원하지 않아서, TreeMap을 이용해 multiset을 흉내내어 풀었습니다.
key값을 원소, value를 빈도로 설정하고 구현했습니다.
문제 5: 구간 나누기 2
문제 난이도
Gold 4
문제 유형
접근 방식 및 풀이
처음엔 DP로 접근했습니다.
$O(N^2M)$ 으로 제한 시간안에 절대 풀 수가 없었습니다.
dp[n][k] = n번째 원소까지만 사용해서 구간을 k개 만들었을 때의 점수 최댓값 중 최솟값
이렇게 식을 세우니,
그 후로, 이 문제를 결정 문제로 바꿔서 바라봤습니다.
$O(N)$ 에 할 수 있었습니다.
구간의 점수의 최댓값의 최솟값이 k가 되도록 할 수 있을까?
-> 이 결정 문제를 해결하는 것은
위의 k값을 단순히 0부터 차례대로 다 확인해주는 방식으로 해결했습니다.
문제 6: 도로검문
문제 난이도
Gold 1
문제 유형
접근 방식 및 풀이
초기 그래프에서 다익스트라를 한 번 돌려서 최단 경로를 구했습니다.
그리고, 간선을 직접 그래프에서 하나씩 제거하며 매번 다익스트라르 다시 돌려서 그 중 최댓값을 구했습니다.
두 값을 비교해서 정답을 판별했습니다.
Trouble Shooting
알맞게 잘 짠 것 같은데 계속 메모리 초과가 발생했습니다.
그래프를 인접 리스트 방식으로 구현해서 생긴 문제인가 싶어, 인접 행렬 방식으로 바꾸어 제출했더니 시간 초과가 발생했습니다.
-> 인접 리스트 방식으로 구현하되, 간선 클래스를 직접 구현하고 모든 변수들을 전역으로 빼주니 아슬아슬하게 통과했습니다.
문제 7: 팰린드롬 분할
문제 난이도
Gold 1
문제 유형
접근 방식 및 풀이
간단한 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
문제 유형
접근 방식 및 풀이
'S', 'K'인 칸에서만 로봇을 복제할 수 있다는 조건에서, 최적의 값은 항상 MST의 형태를 이룬다는 것을 캐치했습니다.
MST를 캐치하고 난 뒤, 주어진 격자를 그래프화 해줬습니다.
모든 'S', 'K'끼리의 최단 거리를 간선으로 삼아 크루스칼 알고리즘을 돌려 답을 구했습니다.