본문 바로가기

Algorithm/Graph Theory

(7)
최종 순위 문제 - 팀별 작년 순위가 주어진다. - 이번 년도에 순위가 바뀐 두 팀이 주어진다. (2, 4)일 시 만약, 팀2가 팀4보다 순위가 높았다면 이번에는 팀4가 팀2보다 순위가 높음 - 순위 변경을 확인해 이번년도 순위를 구하고 구할 수 없다면 Impossible을 출력 로직 위상정렬을 사용한다. indegree(진입차수)가 낮을수록 높은 순위를 의미. 예를들어, 작년 순위가 5, 4, 3, 2, 1 일 때, 진입차수는 0, 1, 2, 3, 4 임을 의미한다. 또한 팀별 연결 여부를 통해 누가 더 높은 순위인지 체크한다. 예를 들어, 위와 같은 경우에서는 5 - 4, 3, 2, 1 보다 크다. 4 - 3, 2, 1 보다 크다. 3 - 2, 1 보다 크다. 2 - 1 보다 크다. 1 - 이를 true로 설정..
행성 터널 문제 행성마다 x, y, z 좌표가 주어지고 총 n개의 행성이 있다. 행성마다의 거리는 Math.min(|x0-x1|, |y0-y1|, |z0-z1|}) 이다. 이 때, 최소한의 비용을 활용하여 모든 행성을 연결해야 한다. 로직 1. 데이터에 각각 인덱스를 리스트 말미에 삽입 2. 데이터 리스트에서 x를 기준으로 오름차순 정렬 3. 정렬된 데이터 중 앞에서부터 바로 자신의 뒤에 인덱스와 |x0-x1|을 구해 거리 리스트에 {차이 절대값, 현재 행성의 인덱스, 다음 행성의 인덱스} 삽입 -> 가능한 이유 : 우선적으로 x를 기준으로 정렬하면, x좌표로 정렬됨 따라서 x0과 x1을 비교하고 x0과 x2는 비교할 필요가 없어짐 -> 왜냐하면 거리가 무조건 적으로 x0-x1이 더 작기 때문에 또한 크루스칼 알고..
탑승구 문제 - G개의 공항 게이트 수가 주어진다. - P개의 착륙 예정 비행기 수가 주어진다. - 순차적으로 비행기가 착륙 가능한 탑승구의 범위가 주어진다. - 이때 특정 비행기가 착륙가능한 게이트가 없을시 종료 시킨다. 예시 4, 1, 1 이 주어졌을 때 첫번째 비행기는 1~4 게이트에 착륙 가능하다. 두번째 비행기는 1번 게이트에만 착륙 가능하다. 세번째 비행기는 1번 게이트에만 착륙 가능하지만 두번째 비행기 또한 1번 게이트에만 착륙 가능하므로 종료 된다 결과적으로 최대 2개의 비행기만 착륙 가능하다. 아이디어 - 크루스칼을 "착륙 가능한 범위로 사용한다" 처음 문제를 풀 때, 리스트를 1부터 G까지 1로 설정하였다. 이 후, 예를 들어, 2가 들어오면 2에 위치한 리스트 값을 -1 해주었고 만약 또 2..
커리큘럼 문제 특정 수업을 듣고 싶을 때, 이 과목을 수강하기 위한 선수과목이 존재할 수 있다. 따라서 특정 수업을 듣기 위해서는 해당 선수과목을 수강한 후 수강이 가능하다. 0번 과목부터 N번 과목까지 수강 소요 시간, 선수과목 인덱스가 주어질 때, 모든 과목을 듣는데 각각 필요한 최소시간을 구하라. 로직 예를 들어 데이터가 다음과 같이 주어졌다고 가정하자. data 10 10, 1 4, 1 4, 3, 1 3, 3 즉, 0번과목을 듣기 위해서는 10시간이 필요하고 선수과목은 없다. 또한 1번 과목을 듣기위해서는 0(1-1)번 과목을 선수강해야하고 소요시간은 10시간이 소요된다. 1. 인접행렬을 만든다. - 특정 과목을 듣고 다음에 들을 수 있는 과목을 체크함을 위함.(특정 과목의 인접행렬에 들어간 인덱스는 이 ..
도시 분할 계획 문제 - 도시들이 서로 연결된 간선이 주어진다. - 간선으로 도시들 간 그룹을 만든다. - 그룹을 두개로 나눌 것이다 - 각 그룹은 적어도 하나의 도시로 이루어진다. - 간선 비용을 최소로 하고 싶다. 아이디어 - 그룹 지은 후에 선을 하나 삭제 시 그룹은 두개로 나뉜다. 코드 public class Question2 { public static void main(String[] args){ int[][] data = { {1, 2, 3}, {1, 3, 2}, {3, 2, 1}, {2, 5, 2}, {3, 4, 4}, {7, 3, 6}, {5, 1, 5}, {1, 6, 2}, {6, 4, 1}, {6, 5, 3}, {4, 5, 3}, {6, 7, 4} }; Arrays.sort(data, Comparat..
팀 결성 문제 - 학생들이 0번부터 N번까지 존재한다. 팀 합치기, 같은 팀 여부 확인 연산을 실행하라. - 데이터가 주어질때, 앞자리가 0이면 합치기 연산, 1이면 같은 팀 확인 여부 연산을 실행한다. 구현 - 서로소 집합 알고리즘 - 경로 최적화 코드 public class Question1 { public static void main(String[] args){ int[][] data = { {0, 1, 3}, {1, 1, 7}, {0, 7, 6}, {1, 7, 1}, {0, 3, 7}, {0, 4, 2}, {0, 1, 1}, {1, 1, 1} }; int[] parents = new int[8]; for(int i=0; i parent2) ? parent2 : parent1; parents[parent2..
Graph Theory - Concept 해당 문제는 "이것이 코딩 테스트이다" 책을 참고하여 제작하였습니다. 크루스칼 알고리즘 사용시 findParent 마지막에 한번 더 돌려줄 것. 그래프 알고리즘의 종류 - DFS/BFS (큐, 재귀함수) - 다익스트라 (우선순위 큐(최소 힙, 최대 힙)) - 크루이드 워셜 (삼중 반복문) - 크루스칼 알고리즘 (그리디 알고리즘으로 분류) - 위상 정렬 알고리즘 (큐, 스택 자료구조로 분류) 최소 힙, 최대 힙 - 트리 구조로서 부모노드가 자식노드보다 크거나 작거나 한 구조 그래프 vs 트리 - 그래프 방향성 : 방향 그래프 or 무방향 그래프 순환성 : 순환 or 비순환 루트 노드 : 없음 부모 자식 관계성 : 없음 모델 : 네트워크 모델 - 트리 방향성 : 방향 그래프 순환성 : 비순환 루트 노드 : ..