Skip to content

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

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

Conversation

oncsr
Copy link
Contributor

@oncsr oncsr commented Apr 14, 2025

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

📌 문제 풀이 개요

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

✅ 문제 해결 여부

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

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

💡 풀이 방법

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

문제 난이도

Gold 1

문제 유형

  • 시뮬레이션

접근 방식 및 풀이

문제 구성이 복잡하기 때문에, 필요한 정보가 뭔지부터 파악했습니다.

먼저, 물고기가 가지는 요소는 격자에서의 위치와 바라보는 방향입니다.
위치 정보를 제외하면 방향을 나타내는 정수 하나만 남게 됩니다.
따라서, 물고기의 정보를 List[][] 형태로 나타내어 물고기의 좌표는 인덱스로 쓰고, 방향 정보만 각 리스트 안에 넣어 관리했습니다.

다음으로, 물고기의 냄새는 냄새가 발생한 위치시각에 대한 정보를 가집니다.
물고기의 냄새는 물고기와 달리, 격자의 각 칸에서 가장 늦게 발생한 냄새 하나만을 관리해도 괜찮습니다.
따라서, 물고기의 냄새 정보를 int[][] 형태로 나타내어 냄새가 존재하는 좌표를 인덱스로 관리했습니다.

상어의 정보는 위치만을 가집니다. 따라서 int형 변수 두 개로 관리했습니다.

8방향 이동을 구현할 dx, dy배열은 문제에서 주어진 우선순위에 맞게 세팅했습니다.

이후, 문제 지문에 나와있는 5단계를 각각 함수로 구현했습니다.

copyStart

물고기의 정보를 복제합니다.

moveFish

물고기를 모두 이동시킵니다.
이 때, 기존의 격자와 정보가 충돌하는 일이 생기지 않도록 새로운 격자를 임시로 만들어서 구현했습니다.

moveShark

상어를 이동시킵니다.
상어의 이동은 삼중 반복문으로 구현했고, 상어가 이번 턴에 지났던 칸을 다시 지났을 때 물고기를 중복해서 세지 않도록 visit 체크를 해줬습니다.
(dfs처럼 구현했으면 코드가 깔끔했을 것 같은데 이 부분이 살짝 아쉬웠습니다...)

removeSmell

두 턴이 지난 냄새를 모두 없애줍니다.

copyEnd

복제된 물고기들을 격자 내에 풀어줍니다.


지난 번 추가 문제로 나온 적 있던 문제였는데, 그 때는 상어가 같은 턴에 이미 지나온 칸을 또 갈 수 없다고 생각하고 풀었습니다.
당연히 예제조차 제대로 나오지 않아서 그대로 포기했었는데, 다시 풀게 되니 뿌듯하네요


문제 2: 궁금한 민호

문제 난이도

Gold 2

문제 유형

  • 분리 집합
  • 최단 경로

접근 방식 및 풀이

주어진 쌍에 대한 모든 간선을 가중치가 작은 순으로 하나씩 봅니다. (크루스칼 알고리즘과 흡사)
각 간선이 잇는 두 정점이 같은 컴포넌트에 속해있다면, 둘 사이의 최단 거리 D를 현재 간선의 가중치 C와 비교합니다.

만약 C < D라면, 이 간선을 그래프에 추가해야 합니다.
C == D이면, 이 간선을 넣지 않아도 됩니다.
C > D라면, 불가능한 경우입니다.

최단 거리는 여러 방법으로 구할 수 있으며, 저는 플로이드-워셜로 구했습니다.


문제 3: 놀이 공원

문제 난이도

Gold 1

문제 유형

  • 매개 변수 탐색

접근 방식 및 풀이

결정 문제로 바꾸는 아이디어가 신기한 문제입니다.

저는 "특정 시간 내에 N명의 아이들을 모두 태울 수 있는지?"라는 문제로 바꿔서 접근했습니다.
바뀐 문제는 $O(M)$에 해결이 가능하고, 가능/불가능 여부가 단조롭습니다. => 이분 탐색으로 가능한 최소 시간을 찾을 수 있습니다.

이 최소 시간을 $t$라고 하면,
$t-1$ 이하의 시간에 탄 아이들을 모두 N에서 빼주고 $t$의 시간에 탈 수 있는 놀이기구 중 N번째 기구를 구해줬습니다.


문제 4: BFS 스페셜 저지

문제 난이도

Gold 3

문제 유형

  • TreeSet
  • BFS

접근 방식 및 풀이

주어진 순서대로 직접 BFS를 수행할 수 있는지 판별했습니다.
이 때, 간선의 존재 여부를 빠르게 확인하기 위해서 List 대신 TreeSet으로 인접 리스트를 관리했습니다.


문제 5: 청소년 상어

문제 난이도

문제 유형

접근 방식 및 풀이


문제 6: 시계 사진들

문제 난이도

Platinum 4

문제 유형

  • KMP

접근 방식 및 풀이

두 시계가 동형인지 확인하라는 문제라서, 정렬한 후 서로 인접한 바늘 사이의 각도 차이를 저장했습니다.

시계 방향 회전을 효율적으로 처리하기 위해, 두 시계 중 한 쪽은 길이를 두 배로 늘립니다.

이후, 짧은 쪽을 패턴으로 두고 KMP를 수행하여 한 번이라도 매칭이 된다면 두 시계는 동형입니다.


문제 7: 달빛 여우

문제 난이도

Gold 1

문제 유형

  • 다익스트라

접근 방식 및 풀이

달빛 여우의 최단 거리는 기본적인 다익스트라로 구할 수 있습니다.

달빛 늑대의 경우에는, 홀수 개의 간선을 지나온 경우와 짝수 개의 간선을 지나온 경우를 각각 따로 저장해서 해결했습니다.

계산 중에 소수점이 나오는 것을 막기 위해 모든 간선의 가중치를 두 배씩 늘려주었습니다.


문제 8: 주사위 윷놀이

문제 난이도

문제 유형

접근 방식 및 풀이


@oncsr oncsr changed the title [BOJ-1507] 궁금한 민호.md [권혁준-13주차 알고리즘 스터디] Apr 14, 2025
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