개발 블로그
article thumbnail
1197번. 최소 스패닝 트리
Algorithm/백준 알고리즘 2024. 1. 18. 15:37

아이디어 MST 를 구하는 문제이므로 대표적인 방법들 중 취향에 맞게 선택해서 풀면 된다. 나는 오늘 처음 보는 알고리즘이라 둘 중 Kruskal 알고리즘을 사용했고, UNION-FIND 를 이용해 사이클을 방지하도록 했다. 다만 UNION-FIND 과정에서 서로 다른 그룹을 그룹화 할 때 그룹화 하기 위해서는 각 그룹의 루트 노드를 연결해줘야 하는데 이 부분에 실수로 입력 노드를 연결하는 방식을 취해서 애를 먹었다. 풀이코드 import java.io.BufferedReader; import java.io.IOException; import java.io.InputStreamReader; import java.util.Arrays; import java.util.PriorityQueue; import ..

article thumbnail
2638번. 치즈
Algorithm/백준 알고리즘 2024. 1. 16. 15:53

아이디어 처음에는 치즈가 존재하는 칸을 찾고 이 칸을 기준으로 인접한 4칸을 탐색한 후 빈 칸이 몇 개인가를 카운팅하는 로직을 생각했으나 치즈 내부 공간은 치즈가 녹는 데 영향을 미치지 않으므로 이 방법을 사용할 수 없었다. 그래서 치즈가 없는 외부에서 dfs 또는 bfs 를 수행하고 치즈로 막힌 경우 다른 경로를 찾게함으로써 치즈 외부 빈칸을 모두 탐색하는 방식을 사용했다. 이 때 내부 공간과 구분하기 위해 탐색된 칸의 값은 음수로 설정해주었다. 이렇게 외부 공간을 표시한 후 현재 치즈가 녹으면 큐에서 제거해주고 아니면 다시 큐에 추가하는 방식을 사용했고 치즈를 담은 큐에 아무것도 남지않을 때까지 반복해 시간을 구했다. 풀이코드 import java.io.BufferedReader; import jav..

article thumbnail
16236번. 아기 상어
Algorithm/백준 알고리즘 2024. 1. 14. 11:02

아이디어 먼저 BFS 를 통해 현재 상어의 위치에서 가까운 위치부터 탐색을 진행하며 먹을 수 있는 물고기가 있는지 확인한다. 이 때 자신보다 큰 물고기가 있는 칸은 상어가 통과할 수 없으므로 이 점에 주의해서 BFS 를 수행한다. 먹을 수 있는 물고기가 없으면 false 를 반환하고 먹을 수 있는 물고기가 있다면 1. 해당 물고기의 위치로 상어를 이동시키고, 2. 소요된 시간을 더해주고 3. 먹은 물고기 수를 늘려준 후 4. 먹은 물고기 수가 상어의 크기와 같다면 상어의 크기를 키워준다. 5. true 를 반환한다. 위 내용이 false 를 반환할 때까지 반복하면 문제에서 요구하는 답을 얻을 수 있다. 풀이코드 import java.io.BufferedReader; import java.io.IOExce..

14938. 서강그라운드
Algorithm/백준 알고리즘 2024. 1. 12. 20:48

https://www.acmicpc.net/problem/14938 14938번: 서강그라운드 예은이는 요즘 가장 인기가 있는 게임 서강그라운드를 즐기고 있다. 서강그라운드는 여러 지역중 하나의 지역에 낙하산을 타고 낙하하여, 그 지역에 떨어져 있는 아이템들을 이용해 서바이벌을 www.acmicpc.net 아이디어 각 지역에 낙하했을 때 얻을 수 있는 아이템은 아이템이 있는 지역과 낙하한 지역 간 거리가 수색범위를 벗어나지 않는 경우이다. 따라서 1. 모든 지역 간의 최단 경로의 길이를 구하고 2. 임의의 낙하 지역에서 타 지역과의 거리가 수색 범위를 벗어나지 않는 경우에 한해 해당 낙하 지역에서 얻을 수 있는 아이템을 계산하고 3. 이 값들을 비교해 최대값을 얻어내면 된다. 입력의 크기가 작아 플로이드..

article thumbnail
17144번. 미세먼지 안녕!
Algorithm/백준 알고리즘 2024. 1. 11. 21:39

아이디어 문제는 되게 길어보이지만 결국 정리하자면 정해진 시간 동안 1. 확산 2. 공기청정 과정을 수행하고 마지막에 남은 먼지 양을 체크하는 문제이다. 공기청정 과정은 배열에 담긴 값을 한 칸씩 밀면 되는 단순한 단계이고 약간 머리를 써야 하는 부분은 '확산' 이다. '확산'은 현 시점에서 먼지가 있는 모든 위치에서 동시에 일어나야 하므로 배열 하나만 사용할 경우 현 시점에 확산된 먼지가 동일한 시점에 재확산 되는 현상이 발생한다 따라서 '확산' 시에는 임시 배열을 만들어 임시 배열로 확산을 수행해야 한다. 풀이코드 import java.io.BufferedReader; import java.io.IOException; import java.io.InputStreamReader; import java...

article thumbnail
11054번. 가장 긴 바이토닉 부분 수열

아이디어 Sk 를 기준으로 양쪽을 잘라보면 S1 Sk+1 > ... > Sn 이므로 각각 증가하는 부분 수열, 감소하는 부분 수열임을 알 수 있다. 따라서 가장 긴 바이토닉 부분 수열은 배열의 각 원소를 Sk 로 놓고 가장 긴 증가하는 부분 수열, 가장 긴 감소하는 부분 수열을 구한 후 바이토닉 부분 수열을 계산하고, 각 바이토닉 부분 수열 중 가장 긴 놈의 길이를 출력하면 된다. 풀이코드 import java.io.BufferedReader; import java.io.IOException; import java.io.InputStreamReader; import java.util.StringTokenizer; public class Main { publi..

article thumbnail
10830번. 행렬 제곱

아이디어 A ^ N = (A ^ N/2) * (A ^ N/2) 이므로 재귀함수를 활용하되 시간복잡도가 커지지 않도록 N/2 크기씩 줄여가며 재귀함수를 호출하면 충분히 통과가 가능하다. 지수 연산을 하는 exp() 메서드와 행렬 곱셈 연산을 수행하는 multiply() 메서드를 만들어 문제를 해결하면 된다. 풀이코드 import java.io.BufferedReader; import java.io.IOException; import java.io.InputStreamReader; import java.util.StringTokenizer; public class Main { static int N; static int[][] I; public static void main(String[] args) thr..

article thumbnail
2448번. 별 찍기 - 11

아이디어 출력을 보고 유추할 수 있는 것은 N = 24 일 때의 별은 N = 12 일 때의 별을 3개 출력한 결과라는 것이다. 따라서 재귀함수를 활용하면 문제를 해결할 수 있을 것이라 생각했고 각 별이 출력되는 위치가 다르기 때문에 좌표와 별의 크기를 입력으로 받는 재귀함수를 만들면 된다고 생각했다. 해당 함수를 draw(int i, int j, int N) 이라고 가정하고 예제를 살펴보면 draw(0, 0, 24) -> draw(0, 12, 12) -> draw(12, 0, 12) -> draw(12, 24, 12) 와 같이 N = 24 짜리 별을 위해서 (0, 12) 에서 시작해 N = 12 인 별, (12, 0) 에서 시작해 N = 12인 별, (12, 24) 에서 시작해 N = 12 인 별을 출력..