-
Notifications
You must be signed in to change notification settings - Fork 1
[한종욱-14주차 알고리즘 스터디] #68
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
Ukj0ng
wants to merge
80
commits into
main
Choose a base branch
from
ukjong/week-14
base: main
Could not load branches
Branch not found: {{ refName }}
Loading
Could not load tags
Nothing to show
Loading
Are you sure you want to change the base?
Some commits from the old base branch may be removed from the timeline,
and old review comments may become outdated.
Open
Conversation
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
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반 알고리즘 스터디 14주차 [한종욱]
📌 문제 풀이 개요
✅ 문제 해결 여부
💡 풀이 방법
문제 1: 마법사 상어와 복제
문제 난이도
Gold 1
문제 유형
이분 탐색, 매개 변수 탐색
접근 방식 및 풀이
통나무의 가장 긴 조각의 최소값을 구하고, 그 경우 처음 자르는 위치가 가장 작은 위치를 찾습니다.
통나무의 가장 긴 조각의 최소값 구하기
자를 수 있는 위치를 TreeSet에 넣고 이분 탐색으로 구한 길이와 현재 위치를 더해 그 값 이하인 위치를 찾아 현재 위치로 갱신해 줍니다.
갱신하면 해당 위치 이하의 값들을 TreeSet에서 모두 지웁니다.
set.headSet(point, true).clear();
길이가 l을 넘어가거나 자르는 횟수가 c이상이면 while문을 끝내고 마지막 남은 조각의 길이를 판단해 해당 최소값으로 길이를 자를 수 있는지 판단합니다.
처음 자르는 위치를 구하기
뒤에서 부터 1번에서 한 방법을 적용합니다.
시간복잡도:$O(k \times logk + c \times k \times log l)$
문제 2: 팰린드롬 만들기
문제 난이도
Gold 3
문제 유형
DP
접근 방식 및 풀이
dp[i][j]는 i번째 위치에서 j번째 위치까지의 부분 수열을 팰린드롬으로 만들기 위해 추가해야 하는 최소 숫자 개수입니다.
두 위치의 숫자가 같은 경우
arr[i] == arr[j]
,dp[i][j] = dp[i - 1][j + 1]
로 양 끝을 제외한 팰린드롬에 필요한 숫자의 값과 같습니다.두 위치의 숫자가 다른 경우
arr[i] != arr[j]
,dp[i][j] = Math.min(dp[i - 1][j], dp[i][j + 1]) + 1
로 왼쪽에 하나를 추가하거나 오른쪽에 하나를 추가하는 경우 중 최소값에 1을 더합니다.시간복잡도:$O(n^2)$
문제 3: 박스 채우기
문제 난이도
Gold 2
문제 유형
접근 방식 및 풀이
시간복잡도:
문제 4: 온풍기 안녕!
문제 난이도
Platinum 5
문제 유형
구현
접근 방식 및 풀이
각 단계를 3가지 일로 나눌 수 있습니다,
hotAirBlower(heater)
controlTemperature()
downTemperature(heater)
hotAirBlower(heater)
BFS를 통해 온풍기 바람을 확산합니다. dx, dy의 인덱스 처리를 편하게 하고 싶어서 패딩처리를 했습니다.
처음엔 q가 아닌 pq로 addable과 blank를 HashSet으로 구현했는데, 다 풀고 보니 pq가 q로 바뀔 수 있었습니다.
수정 후에도 크게 시간이 빨라지지 않길래 aadable과 blank에서 중복 처리를 편하게 하기 위해 HashSet으로 구현했지만,
int[]은 배열의 참조가 비교되므로 중복 처리가 되지 않아 visited[][]을 추가해 처리했습니다.
그렇다면 HashSet의 구현 의미는 없어지고 요소를 끝에 추가할 때 더 빠른 List로 구현체를 변경하니
744ms -> 524ms 까지 빠르게 동작할 수 있었습니다.
앞으론 자료구조를 선택할 때, 선택의 이유를 확실하게 얘기할 수 있는 자료구조를 선택해서 구현할 예정입니다.
controlTemperature()
인접한 칸과의 온도 차이 / 4만큼 온도 조절을 해야 합니다. 동시에 일어나는 현상이기 때문에 복사본 맵을 사용해서 구현했습니다.
downTemperature(heater)
외벽의 온도를 1씩 낮춰야 합니다. 중요한 것은 모서리를 두 번 계산하지 않아야 합니다.
시간복잡도:$O((r \times c)^{2})$
문제 5: 움직이는 미로 탈출
문제 난이도
Gold 3
문제 유형
BFS
접근 방식 및 풀이
욱제는 7초만 살아있으면 무조건 목적지에 도달할 수 있습니다. 벽을 이동시키는 것보다 아래 물이 차오른다는 느낌으로 문제를 풀었습니다.
이동 조건은
nx + current[2] > n - 1
: 아래서 물이 차올라 시간이 지날 수록 이동할 수 있는 x값이 작아집니다.map[nx][ny] == '#'
: 벽으로 이동할 수 없습니다.nx > 0 && map[nx - 1][ny] == '#'
: 벽이 내려왔을 때, 벽에 부딪히면 이동할 수 없습니다.이렇게 7초동안 살아남으면 목적지에 도달한다고 판단했습니다.
시간복잡도:$O(n \times m \times log(n\times m))$
문제 6: 싸지방에 간 준하
문제 난이도
Gold 3
문제 유형
자료 구조, 우선순위 큐
접근 방식 및 풀이
접근 방식 1
그냥 이중 for문으로 컴퓨터를 앞에서 부터 탐색합니다. 시간 2500ms
접근 방식 2
정렬을 두 개로 해야하므로 1개는 시간에 따른 using, 1개는 컴퓨터 숫자에 따른 blank로 놓고
시간이 들어오면 시작 시간 전에 using을 처리하고, blank에 자리가 없다면 새 컴퓨터를 키고, blank에 컴퓨터가 있다면 가장 작은 번호의 컴퓨터를 할당합니다.
시간복잡도:$O(n^2 \times log{n}))$
문제 7: 종이 조각
문제 난이도
Gold 2
문제 유형
접근 방식 및 풀이
시간복잡도:
문제 8: 일요일 아침의 데이트
문제 난이도
Gold 2
문제 유형
다익스트라
접근 방식 및 풀이
저번 주의 달빛 여우와 비슷한 유형의 문제였습니다. 쓰레기를 지나가는지 인접하는지를 확인하기 위해 dist를 3차원으로 선언합니다.
문제가 정말 헷갈리는데, 'g'를 지나가면 dist[x][y][0]에 1을 더해주고, 쓰레기가 인접할 때 dist[x][y][1]에 1을 더해줍니다.
쓰레기가 인접하다는 것은 4방향에 'g'가 있는 것이며, 도착한 칸이 빈칸이어야 합니다. 또, 쓰레기가 인접했을 때 인접한 쓰레기의 개수를 더하는게 아닌 1만 더합니다.
시간복잡도:$O(m\times logn)$