Skip to content

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

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

Conversation

Gyulguma
Copy link

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

📌 문제 풀이 개요

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

✅ 문제 해결 여부

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

💡 풀이 방법

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

문제 난이도

  • 골드 3

문제 유형

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

접근 방식 및 풀이

  • 주어진 수열을 k개의 그룹으로 나누었을 때 각 그룹의 총합의 최솟값의 최댓값을 구하는 문제입니다.
  • 최솟값의 최댓값을 구하는 문제이기에 이분 탐색으로 접근하였습니다.
  • 각 그룹의 총합의 최솟값을 mid로 설정하였습니다. 즉, 각 그룹의 총합은 최소한 mid값을 넘어야 함을 의미합니다.
  • counting 함수는 mid를 전달 받아 수열에서 조건을 만족하는 그룹을 만들 수 있는 개수를 반환합니다.
  • count 값에 따라 다음과 같이 조정합니다.
    • 그룹의 개수가 k보다 작을 경우: mid 값이 너무 큰 것이므로 mid 값을 줄인다
    • 그룹의 개수가 k보다 클 경우: mid 값이 너무 작은 것이므로 mid 값을 키운다.
    • 그룹의 개수가 k와 같을 경우: 최댓값을 찾는 것이 목표이므로 mid 값을 키운다.
  • 이분탐색이 종료되었을 때 rightleft는 다음과 같은 의미를 가집니다.
    • right: 조건을 만족하는 값들 중 최댓값
    • left: 조건을 만족하지 않는 값들 중 최솟값
  • 때문에 right를 반환하여 문제를 해결하였습니다.

문제 2: 구슬 탈출 4

문제 난이도

  • 골드 1

문제 유형

  • 구현, BFS, 시뮬레이션

접근 방식 및 풀이

  • 빨간 구슬 위치와 파란 구슬 위치의 방문 처리를 4차원 배열로 저장하여 해결하였습니다.
  • '기울이기'를 할 때 파란 구슬과 빨간 구슬 중 해당 방향으로 앞에 있는 구슬을 먼저 움직이도록 구현하였습니다.

문제 3: 세부

문제 난이도

  • 골드 3

문제 유형

  • 자료 구조, MST

접근 방식 및 풀이

  • 프림 알고리즘을 사용하였고 이때 금빼빼로를 최대한 많이 가져가야 하기에 간선의 가중치가 작은 것이 아닌 큰 것을 기준으로 추가하였습니다.
  • 문제에서 가져가지 못하는 경우는 주어지지 않는다라는 조건이 없으므로 만약 갈 수 없을 경우 '0'을 출력하도록 하여 문제를 해결하였습니다.

문제 4: 커플 만들기

문제 난이도

  • 골드 2

문제 유형

  • DP, 그리디, 정렬

접근 방식 및 풀이

  • 우선 최대한 많은 커플을 만들기 때문에, 인원 수가 더 적은 그룹은 모두 커플을 이뤄야합니다.
  • 인원 수가 더 적은 그룹의 인원 수를 a, 반대편을 b라고 할 때(a<=b) b개 중에서 a개를 선택해야 하고 이때의 커플 간 성격 차이의 합이 최소가 되어야 하므로 먼저 두 그룹을 정렬하였습니다.
  • 이때 a와 b의 최댓값이 1000이기 때문에 완전 탐색으로는 답을 구할 수 없고 가장 가까운 값끼리 매칭하는 그리디 방식으로는 최적의 해를 보장할 수 없어 DP로 접근하였습니다.
  • DP[i][j] : i명과 j명 중 일부를 매칭했을 때 얻을 수 있는 각 성격 차이의 합의 최솟값으로 정의 하였습니다.
  • 이때 i는 인원 수가 더 작은 그룹, j는 더 큰 그룹으로 설정하였으며 j번째 사람이 커플에 포함되는 경우와 되지 않은 경우로 나누어 접근하였습니다.
    • j가 포함되지 않는 경우: DP[i][j-1]
    • j가 포함되는 경우: DP[i-1][j-1] + |a[i] - b[j]|
  • 주의할 점은 j가 더 큰 인원 수 그룹의 값이기 때문에 항상 i<=j를 만족해야 합니다.

문제 5: Ignition

문제 난이도

  • 플레티넘 5

문제 유형

접근 방식 및 풀이


Comment on lines +55 to +67
// DP 계산
for (int i=1; i<=smallSize; i++) {
for (int j=i; j<=largeSize; j++) {
if (j == i) {
dp[i][j] = dp[i-1][j-1] + Math.abs(small[i] - large[j]);
} else {
dp[i][j] = Math.min(
dp[i][j-1], // j번째 사람을 선택하지 않는 경우
dp[i-1][j-1] + Math.abs(small[i] - large[j]) // j번째 사람을 선택하는 경우
);
}
}
}
Copy link
Contributor

Choose a reason for hiding this comment

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

저는 j번째 사람을 선택하는 경우와 선택하지 않는 경우를 따로 처리하려고 dp 배열 두 개를 관리했는데 그럴 필요가 없었군요... 좋은 코드네요 👍

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