알고리즘/백준 (18) 썸네일형 리스트형 백준 - 1068번 트리 - java https://www.acmicpc.net/submit/1068/35162027 접근법 기본적인 트리를 생성하고 했으나 그럴필요는 없어보임 Node배열을 N개만큼 생성해서 각 인덱스에 ArrayList를 주고, 각각 자식을 add하여 tree배열을 완성함 만약 제거하는 인덱스가 루트노드면 바로 0출력 후 종료 아니면, q에 root노드를 넣는걸로 시작. 3-1. q에 있는 노드의 자식들을 bfs로 탐색 3-2. 자식의 인덱스가 만약 제거하고자 하는 인덱스면 무시, 그렇지 않으면 q에 넣기 3-3. 현재 q에 있던 인덱스에서 자식이 없거나, 있어도 제거되는 자식이면 리프노드이므로 카운트 올림 소스 import java.util.*; import java.io.*; public class Main { sta.. 백준 - 1766번 문제집 - java https://www.acmicpc.net/problem/1766 접근법 기본적인 위상정렬문제로 해결 1. graph라는 List배열을 할당해주고, 2. 각각 인덱스에 후속작업의 인덱스를 넣어줌. graph[pre].add(post) 넣어주면서, 전 작업이 필요한 경우 count를 올려줌. inDegree[post]++ 4번은 1번 앞에 있어야함 => graph(1).add(4), 5번은 1번 앞에있어야함 => graph(1).add(5) inDegree의 값이 0인 인덱스에 대해 우선순위 큐에 삽입 (문제에서 숫자가 빠른순으로 처리하라는 내용이 있으므로 우선순위 큐를 사용함) 우선순위 큐에 맞게 꺼낸 항목에 대해, 후속작업 List를 탐색하고 각각에 대해 inDegree count를 낮춤 4-1. in.. 백준 - 2146번 다리 만들기 - java https://www.acmicpc.net/problem/2146 접근법 나누어진 육지의 개수가 정해진게 아니라, 중심이 되는 섬과 그렇지 않은 섬으로 구분하는 방식으로 접근함 1. 방문하지 않은 섬의 좌표하나를 통해, bfs로 그 섬의 구분자를 2 로 변경 2. 새로 만들어진 newMap과 시작 시 다리 길이 depth:0을 매개변수로 expand() 함수 진입 3. 중심이 되는 섬의 구분자인 2 를 보고, 유효한 범위로 영역을 한 칸씩 확장 3. i) 확장을 하려다, 다른 섬 구분자인 1 을 만나면, 현재 중심이 되는 섬을 기준으로 가장 짧은 다리가 생성되므로, ANSWER를 갱신해주고 함수를 return 3. ii) 확장이 가능하다면, 구분자 2 를 부여하고 다음 방향 계속 탐색 4. 모든 섬 마다.. 백준 - 1600번 말이 되고픈 원숭이 - java https://www.acmicpc.net/problem/1600 참고하게된 블로그 https://simju9397.tistory.com/25 접근법 처음에는 DFS로 풀이를 하였는데, 메모리초과가 나옴. 전체탐색하는 방법으로 생각해서 그런건데 잘못접근하여서 BFS로 바꿈. Point객체는 좌표 x, y와 이동한 횟수, 말처럼이동한 횟수를 가짐 Dir배열은 0~7은 말처럼 이동하는 경우의 좌표이고, 8~11은 일반 상하좌우 이동 일반 BFS처럼 Queue 생성해서 방문여부 체크하며 진행하는데, 여기서 시간초과나오고 했던 부분이 있음Visit x, y, z 배열의 의미가 중요한데, '말처럼 Z번 움직여서 X, Y좌표에 방문하였는가?'를 의미함 3-1. Z는 0번부터 K번까지이므로 크기는 K+1 짜리 3차원.. 백준 - 10026번 적록색약 - java https://www.acmicpc.net/problem/10026 접근법 기본적인 bfs로 풀이함 그래프 자체를 두가지 버전으로 만들어서, 동일한 bfs탐색 함수를 각각 타게해서 출력시킴 처음에 메모리초과가 떠서 확인해보니 방문처리하는 시점 이 잘못되어있었다. 인접한 4방향을 탐색할 때, 그 즉시 방문처리를 해야 의미없이 queue에 offer하지 않게된다 소스 import java.io.*; import java.util.*; public class Main { static int N; static boolean[][] VISIT; static int[][] dir = {{0, 1}, {0, -1}, {1, 0}, {-1, 0}}; public static void main(String[] args).. 백준 - 1753번 최단경로 - java https://www.acmicpc.net/problem/1753 접근법 최단경로를 다루고 음수의 가중치가 없으니 기본적인 다익스트라 알고리즘이용 그리고 우선순위 큐를 이용하여 가중치가 작은것 먼저 처리되게하여 시간 단축 소스 package dijkstra; import java.util.*; import java.io.*; public class B1753 { static int V; static int E; static ArrayList[] graph; public static void main(String[] args) throws IOException { BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); String.. 백준 - 1238번 파티 - java https://www.acmicpc.net/problem/1238 접근법 최단거리 문제이므로 다익스트라 알고리즘을 적용하면 좋다 기본적인 다익스트라 알고리즘을 적용해서 각각 시작지점별로 단방향을 적용해서 최소거리를 구한다 dist테이블이 완성되면, dist[i][x] + dist[x][i] 의 합으로 i -> x / x -> i 의 값을 계산한다 그 합 중 최대값을 출력하면 정답 소스 import java.util.ArrayList; import java.util.PriorityQueue; import java.util.Scanner; public class Main { static ArrayList[] graph; static int[][] dist; public static void main(Stri.. 백준 - 2667번 단지번호붙이기 - java https://www.acmicpc.net/problem/2667 접근법 DFS나 BFS나 상관없이 가능해보임 1. 지도에서 1인데, 방문하지 않은 지점을 맞이하면 2. 그 Point부터 BFS 혹은 DFS 탐색 3. 방문할때마다 visit 배열 마킹해가며 해당 Point로 시작한 경우 단지의 크기를 count해줌 4. 함수의 return 값을 단지의 크기로 하고, 그 값을 자료구조에 담음 5. 출력할땐 정렬시키고 출력 소스 import java.util.ArrayList; import java.util.Collections; import java.util.LinkedList; import java.util.Queue; import java.util.Scanner; public class Main { s.. 이전 1 2 3 다음