Skip to content

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

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

Conversation

oncsr
Copy link
Contributor

@oncsr oncsr commented Apr 21, 2025

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

📌 문제 풀이 개요

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

✅ 문제 해결 여부

  • 통나무 자르기
  • 팰린드롬 만들기
  • 박스 채우기
  • 온풍기 안녕!
  • 움직이는 미로 탈출

  • 싸지방에 간 준하
  • 종이 조각
  • 일요일 아침의 데이트

💡 풀이 방법

문제 1: 통나무 자르기

문제 난이도

Gold 1

문제 유형

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

접근 방식 및 풀이

가장 긴 막대의 최소 길이는 이분 탐색 + 매개 변수 탐색으로 구했습니다.
(최소 길이를 고정값으로 두고 결정 문제로 변환)

자르는 위치를 찾을 땐 모든 위치에 대해 직접 돌려보는 방법을 적용했습니다.


문제 2: 팰린드롬 만들기

문제 난이도

Gold 3

문제 유형

  • DP

접근 방식 및 풀이

DP식을 아래처럼 정의했습니다.
dp[i][j] = 수열 A에서 구간 [i,j]를 포함하는 팰린드롬을 만들 때, 끼워넣어야 하는 수의 최소 개수
$dp[i][j]$의 값은 구간의 양 끝 원소 $A_i, A_j$로부터 구할 수 있었습니다.

  1. $A_i = A_j$일 때

더 작은 구간에서 이미 구해놓은 DP값을 이용합니다.
$dp[i][j] = dp[i+1][j-1]$

  1. $A_i \neq A_j$일 때

구간의 양 끝 너머로 수를 하나 추가하는 방법입니다.
$dp[i][j] = \min(dp[i+1][j], dp[i][j-1]) + 1$


문제 3: 박스 채우기

문제 난이도

Gold 2

문제 유형

  • 그리디
  • 재귀

접근 방식 및 풀이

우선, 재료로 2의 제곱꼴 길이의 정육면체만 주어지기 때문에 가장 큰 정육면체부터 많이 사용하는 것이 무조건 이득입니다.
가로, 세로, 높이가 각각 $a, b, c$인 박스를 채우기 위한 최소 박스 수를 $f(a,b,c)$라고 정의했습니다.

한 변의 길이가 $2^k$인 박스로 $a \times b \times c$ 크기의 박스를 채우려고 할 때, 가로 세로 높이 각각에 대해 몇 개의 박스까지 배치할 수 있는지 구해서 각각 $g, s, v$라고 했습니다. $(g = a/{2^k}, s = b/{2^k}, v = c/{2^k})$

$2^k$ 박스의 개수와 $g, s, v$의 값을 비교하여, $f(a,b,c)$를 하위 케이스 여러 개의 합으로 구할 수 있습니다. (식이 복잡해서 여기에 적지 못했습니다.)


문제 4: 온풍기 안녕!

문제 난이도

문제 유형

접근 방식 및 풀이


문제 5: 움직이는 미로 탈출

문제 난이도

Gold 3

문제 유형

  • BFS

접근 방식 및 풀이

시간마다 맵의 상태를 모두 따로 저장해두고, 시간 차원을 포함한 3차원 BFS로 해결했습니다.


문제 6: 싸지방에 간 준하

문제 난이도

Gold 3

문제 유형

  • BBST

접근 방식 및 풀이

컴퓨터의 사용 시작, 사용 종료를 따로따로 생각하면, 총 $2N$개의 이벤트가 발생합니다.

사용할 수 있는 컴퓨터의 집합 $S$를 관리합니다. (초기엔 $S = ${$1, 2, \cdots, N$} 입니다.)
시작 이벤트종료 이벤트에 대해, 집합 $S$에서 컴퓨터 사용 혹은 종료를 직접 처리해주고 카운팅 해줬습니다.

저는 TreeSet의 pollFirst() 함수로 해결했고, TreeSet 말고도 균형 잡힌 이진 검색 트리를 사용하는 모든 자료 구조로 해결할 수 있어 보입니다.


문제 7: 종이 조각

문제 난이도

Gold 3

문제 유형

  • 완전 탐색

접근 방식 및 풀이

N, M이 작기 때문에 완전 탐색으로 구현했습니다.

혹시나 시간 초과가 날 까봐, 같은 행에 연속한 가로 조각이 없도록 + 같은 열에 연속한 세로 조각이 없도록 탐색했습니다.


문제 8: 일요일 아침의 데이트

문제 난이도

Gold 2

문제 유형

  • 다익스트라

접근 방식 및 풀이

일반적인 다익스트라 배열 D 말고도, 추가로 C 배열을 두어 쓰레기 옆을 지나는 칸의 최소 수를 저장하도록 구현했습니다.

어떤 칸에 쓰레기가 있다면, 인접한 칸의 쓰레기 여부는 신경쓰면 안 되는 것을 몰라 헤맸습니다.


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