Skip to content

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

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

Conversation

oncsr
Copy link
Contributor

@oncsr oncsr commented May 8, 2025

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

📌 문제 풀이 개요

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

✅ 문제 해결 여부

  • 흩날리는 시험지 속에서 내 평점이 느껴진거야
  • 구슬 탈출 4
  • 세부
  • 커플 만들기
  • Ignition

💡 풀이 방법

문제 1: 흩날리는 시험지 속에서 내 평점이 느껴진거야

문제 난이도

Gold 3

문제 유형

  • 매개 변수 탐색
  • 이분 탐색

접근 방식 및 풀이

최대 점수를 x로 만들 수 있을 때, x 이하로도 항상 만들 수 있음을 보인다면 이분 탐색 + 매개 변수 탐색을 수행할 수 있습니다.
구간을 자를 때는 그리디하게, 합이 x를 넘겼다면 잘라주는 방식을 적용합니다.
그러면, (x로 만들었을 때의 구간 개수) <= (x 이하로 만들었을 때의 구간 개수) 가 성립합니다.

이분 탐색 범위의 상한은 맞은 문제의 합으로 생각해서 2000000으로 잡았습니다.


문제 2: 구슬 탈출 4

문제 난이도

Gold 1

문제 유형

  • BFS
  • 시뮬레이션

접근 방식 및 풀이

빨간 구슬과 파란 구슬의 위치를 상태로 가지는 BFS를 돌려주었습니다.

기울이기 작업이 조금 까다로웠는데, 저는 dx dy 배열과 while문 + 적당한 조건 분기로 구현했습니다.


문제 3: 세부

문제 난이도

Gold 3

문제 유형

  • MST

접근 방식 및 풀이

일반적인 그래프에서 경로의 비용은 가중치의 합이지만, 이 문제에서는 가중치의 최솟값입니다.
따라서, 크루스칼을 돌리는데 간선 가중치가 큰 것부터 고려하여 해결했습니다.


문제 4: 커플 만들기

문제 난이도

Gold 2

문제 유형

  • 정렬
  • DP

접근 방식 및 풀이

성격 차이의 합이 최소가 되어야 함 -> 정렬 후, 포인터 이동시키는 느낌으로 DP를 돌려야겠다고 생각했습니다.

dp[i][j] = i번 남자와 j번 여자를 이어줬을 때의 최소 합.
mn[i][j] = i번 남자와 j번 여자까지만 고려했을 때의 최소 합.
이렇게 dp를 정의했고, 이로부터 dp[i][j] = mn[i-1][j-1] + abs(A[i] - B[j]) 라는 식을 얻었습니다.

이 dp식을 돌려, i >= min(N,M), j >= min(N,M)인 i,j에 대해 dp[i][j]의 최솟값을 구했습니다.


문제 5: Ignition

문제 난이도

Platinum 5

문제 유형

  • 플로이드-워셜

접근 방식 및 풀이

그래프를 모두 태운다 == 모든 간선을 태운다라고 생각했습니다.
따라서 각 간선이 타게 되는 최소 시간을 구하는 방법을 떠올리려 했습니다.

불을 붙이는 정점을 i라고 했을 때, j번 정점이 타게 되는 최소 시간은 i에서 j로 가는 최단 시간입니다.

간선 (s,e,l)에 대해, 이 간선이 타는 방법은 둘 중 하나입니다.

  1. 간선이 한 쪽 방향으로만 탐.
  2. 간선의 양쪽에서 불이 붙어 타게 됨.

둘 모두 일반화할 수 있는 시간은 **(i -> s 최단 시간) + l + (i -> e 최단 시간)**이 됩니다.

모든 정점에 불을 붙여보며 최소 시간을 구해줬습니다.

Comment on lines +53 to +68
static void solve() throws Exception {

Arrays.sort(edges, (a,b) -> b[2]-a[2]);
for(int[] e:edges) {
int a = e[0], b = e[1], c = e[2];
int x = f(a), y = f(b);
if(x == y) continue;
r[x] = y;
if(f(S) == f(E)) {
bw.write(c + "\n");
return;
}
}
bw.write("0");

}
Copy link

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

확실히 이렇게 보니까 제가 프림을 쓴 거 같네요. 처음에 봤을 때, s에서 출발한다는 사고를 해서 다익스트라라고 생각했나봐요.

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.

2 participants