[권혁준-13주차 알고리즘 스터디] #62
Open
Add this suggestion to a batch that can be applied as a single commit.
This suggestion is invalid because no changes were made to the code.
Suggestions cannot be applied while the pull request is closed.
Suggestions cannot be applied while viewing a subset of changes.
Only one suggestion per line can be applied in a batch.
Add this suggestion to a batch that can be applied as a single commit.
Applying suggestions on deleted lines is not supported.
You must change the existing code in this line in order to create a valid suggestion.
Outdated suggestions cannot be applied.
This suggestion has been applied or marked resolved.
Suggestions cannot be applied from pending reviews.
Suggestions cannot be applied on multi-line comments.
Suggestions cannot be applied while the pull request is queued to merge.
Suggestion cannot be applied right now. Please check back later.
🚀 싸피 15반 알고리즘 스터디 13주차 [권혁준]
📌 문제 풀이 개요
✅ 문제 해결 여부
💡 풀이 방법
문제 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
문제 유형
접근 방식 및 풀이
주어진 순서대로 직접 BFS를 수행할 수 있는지 판별했습니다.
이 때, 간선의 존재 여부를 빠르게 확인하기 위해서 List 대신 TreeSet으로 인접 리스트를 관리했습니다.
문제 5: 청소년 상어
문제 난이도
문제 유형
접근 방식 및 풀이
문제 6: 시계 사진들
문제 난이도
Platinum 4
문제 유형
접근 방식 및 풀이
두 시계가 동형인지 확인하라는 문제라서, 정렬한 후 서로 인접한 바늘 사이의 각도 차이를 저장했습니다.
시계 방향 회전을 효율적으로 처리하기 위해, 두 시계 중 한 쪽은 길이를 두 배로 늘립니다.
이후, 짧은 쪽을 패턴으로 두고 KMP를 수행하여 한 번이라도 매칭이 된다면 두 시계는 동형입니다.
문제 7: 달빛 여우
문제 난이도
Gold 1
문제 유형
접근 방식 및 풀이
달빛 여우의 최단 거리는 기본적인 다익스트라로 구할 수 있습니다.
달빛 늑대의 경우에는, 홀수 개의 간선을 지나온 경우와 짝수 개의 간선을 지나온 경우를 각각 따로 저장해서 해결했습니다.
계산 중에 소수점이 나오는 것을 막기 위해 모든 간선의 가중치를 두 배씩 늘려주었습니다.
문제 8: 주사위 윷놀이
문제 난이도
문제 유형
접근 방식 및 풀이