알고리즘 (22) 썸네일형 리스트형 백준 - 11779번 최소비용 구하기 2 - java https://www.acmicpc.net/problem/11779 접근법 기본적인 다익스트라 알고리즘으로 접근함 GRAPH라는 배열에 시작지점 인덱스에 도착지와 가중치를 Node로 담아두고, 입력으로 받는 시작지점과 끝지점으로 함수 시작 dir이라는 배열을 하나 두었는데, 해당 인덱스로 도착할 때 출발했던 인덱스를 저장함. 단, 가중치가 가장 작은 경우에만 갱신하며 이는 큐에 offer할때와 같은 시점에 이루어짐 우선순위 큐를 이용해야 시간초과 안뜸 if(weight[cur.index] < cur.weight) continue으로 현재 가중치 비교해서 건너뛰어줘야 시간을 아낌. 이 라인은 기존 다익스트라에서 해주지 않았던것 같은데 최소 비용만 출력하면 weight배열값만 출력하면 되는데, 방문한 도시 .. 백준 - 2623번 음악프로그램 - java https://www.acmicpc.net/problem/2623 접근법 기본적인 위상정렬문제로 쉽게 해결! 위상정렬의 핵심은 inDegree 배열. 각 인덱스별로 앞서 필요한 항목의 수 만큼 count를 가지고 있고, 조치가 취해지면 count를 깍아나가는 식으로 접근하면 됨 graph는 선행 -> 후행의 관계를 잡기위해 마련한 변수. 입력에 따라 선행, 후행 관계를 graph 배열의 인덱스에 맞게 생성. 생성하면서 후행이 되는 인덱스는 inDegree 배열 값도 올려줌 초기에는 inDegree배열이 0인 값 = 선행조건이 없는 값을 Queue에 넣어주고 반복문 소스 import java.util.*; import java.io.*; public class Main { static int N; // 가.. 백준 - 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차원.. 백준 - 1976번 여행 가자 - java https://www.acmicpc.net/problem/1976 접근법 다른 사람들은 어떻게 풀었는지 꼭 확인이 필요.. 마지막줄에 A->B->D... 이런식으로 여행가고자하는 지점을 주는데, 방문했던 장소를 다시가도 상관없고, 최단거리로 이동해야할 필요도 없음. 그래서 이런식으로 생각함. 인접행렬이 주어지면, BFS를 통해 해당 노드로 부터 갈 수 있는 묶음(=ArrayList)을 만들어줌 만들면서, INDEX[]배열에 각각의 노드가 어떤 인덱스 번호를 가진 위치에 속해있는지를 따로 결정해줌 가고자하는 첫번째 노드의 인덱스를 groupNum으로 지정하고, 가려고하는 모든 노드의 인덱스가 groupNum과 같은지를 비교 = 같은 그룹에 속해있는지 판단 3-1. 탐색하다가 속해있지 않으면, NO 리턴. .. 백준 - 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차원.. 이전 1 2 3 다음