Skip to content

[한종욱-13주차 알고리즘 스터디] #66

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

Conversation

Ukj0ng
Copy link

@Ukj0ng Ukj0ng commented Apr 20, 2025

🚀 싸피 15반 알고리즘 스터디 13주차 [한종욱]

📌 문제 풀이 개요

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

✅ 문제 해결 여부

  • 마법사 상어와 복제
  • 궁금한 민호
  • 놀이 공원
  • BFS 스페셜 저지
  • 청소년 상어

  • 시계 사진들
  • 달빛 여우
  • 주사위 윷놀이

💡 풀이 방법

문제 1: 마법사 상어와 복제

문제 난이도

Gold 1

문제 유형

구현

접근 방식 및 풀이

단계를 나눠서 풀었습니다.

  1. 물고기 복제 준비 - copyMap()
  2. 모든 물고기 이동 - moveFishes()
  3. 상어 3칸 이동 - moveShark()
  4. 냄새 제거 - removeSmell()
  5. 물고기 복제 - copyFish()

2, 3단계에서 주의사항이 있습니다.
2단계에서 물고기가 이동하지 못하면, 제자리에 같은 방향으로 대기합니다.
3단계에서 상어는 지나간 장소를 또 지나갈 수 있습니다.
한번 먹은 물고기는 또 먹을 수 없기 때문에, DFS처리가 까다로웠습니다.

시간복잡도: $O(s)$


문제 2: 궁금한 민호

문제 난이도

Gold 2

문제 유형

접근 방식 및 풀이


문제 3: 놀이 공원

문제 난이도

Gold 1

문제 유형

이분 탐색, 매개변수 탐색

접근 방식 및 풀이

이분 탐색을 할 변수는 시간입니다. 해당 시간으로 n명이상의 아이가 놀이기구를 탈 수 있으면 마지막에 탄 놀이기구의 번호를 저장하고 시간을 줄입니다. 시간이 부족하면 시간을 늘립니다.
마지막에 탄 놀이기구를 확인하는 방법은

  1. 이분 탐색한 시간보다 1초 전에 아이들을 다 태우고
  2. 마지막에 타는 놀이기구에 남은 아이들을 1명씩 태웠습니다.

시간복잡도: $O(m \log{6 \times 10^{14}})$


문제 4: BFS 스페셜 저지

문제 난이도

Gold 3

문제 유형

BFS

접근 방식 및 풀이

탐색한 순서대로 다음 노드를 탐색해야 합니다. 처음엔 깊이로 접근했다가 틀렸습니다.
같은 깊이의 노드들을 set에 넣고 배열의 인덱스 순서대로 탐색했습니다.

시간복잡도: $O(n)$


문제 5: 청소년 상어

문제 난이도

Gold 1

문제 유형

구현

접근 방식 및 풀이


문제 6: 시계 사진들

문제 난이도

Platinum 4

문제 유형

kmp

접근 방식 및 풀이


문제 7: 달빛 여우

문제 난이도

Gold 1

문제 유형

다익스트

접근 방식 및 풀이

여우의 최단경로는 기본 다익스트라로 계산하고, 늑대의 최단경로는 홀수번에 가중치/2로 계산하고 짝수번에 가중치x2로 계산했습니다.
늑대의 홀수번, 짝수번 가중치가 다르기 때문에 늑대의 dist는 2차원 배열로 선언했습니다.

시간복잡도: O(mlogn)


문제 8: 주사위 윳놀이

문제 난이도

Gold 2

문제 유형

접근 방식 및 풀이

*/
private static void binarySearch() {
long left = 0; // 최소 시간
long right = (long)6e14; // 최대 시간 (충분히 큰 값)

Choose a reason for hiding this comment

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

큰 차이는 나지 않겠지만 최대 시간을 운행 시간이 가장 작은 놀이기구 x N으로 설정하면 더 빠른 시간에 찾을 수 있을 것 같습니다!

Copy link
Author

Choose a reason for hiding this comment

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

맞아요 그렇게 최대 시간을 설정하면 더 빨리 찾을 거 같아요


// 각 놀이기구가 태울 수 있는 방문객 수와 마지막 방문객 탑승 시간 계산을 위한 배열
long count[] = new long[m]; // 각 놀이기구가 태울 수 있는 방문객 수
Arrays.fill(count, 1); // 초기에 각 놀이기구는 1명씩 태움

Choose a reason for hiding this comment

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

각 놀이기구 별 시간에 따른 태운 승객 수를 계산할 때 저는 나머지와 몫의 경우에 따라 나눠서 계산했는데, 배열을 1로 채우고 시작하면 몫만 계산하면 되어 더 간단하고 직관적인 풀이인 것 같습니다.

Choose a reason for hiding this comment

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

늑대의 dist 배열을 빠른 상태, 느린 상태에 따른 2중 배열로 저장하는 방법이 인상적입니다! 이 부분을 해결하지 못해 dfs로 구현하고 시간 초과에 걸렸는데 2중 배열로 처리하는 방법이 있었군요..!

Copy link
Author

Choose a reason for hiding this comment

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

말숭이 문제가 생각나서 바로 적용해봤습니다! 같은 그래프 문제니까요!

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