본문 바로가기

Algorithm

(140)
Programmers - 단속 카메라 with JAVA 문제 - 차량의 이동 경로가 주어진다. - 이 때, 최소한의 카메라를 설치하여 모든 차를 한번이라도 단속할 때 설치해야하는 카메라의 수의 최소값을 구하라. 예를 들어, 다음과 같은 경우가 주어진다. 차량1 : [-20, -15] -> 차량1은 -20지점에서 고속도로에 진입해 -15지점에서 고속도로를 빠져나간다. 차량2: [-14, -5] 차량3 : [-18, -13] 차량4 : [-5, -3] 이 때, -15지점과 -5지점에 카메라를 설치하면 모든 차량을 한번은 감시하면서 최소한의 카메라를 설치한 경우가 되는 것이다. 로직 우선, 첫번째 인덱스를 기준으로 차량 데이터를 정렬한다. [-20, -15], [-18, -13], [-14, -5], [-5, -3] 순서대로 1지점, 2지점, 3지점, 4지점이라고..
Programmers - 순위 with JAVA (V) 문제 격투 대회에서 각 참가자의 번호가 1~N으로 주어지고 대결 결과가 주어진다. 이 때, 순위를 정확히 알 수 있는 사람의 수를 구하라. 로직 이 문제는 shortest way의 플로이드 워셜 알고리즘 중에 정확한 순위 문제와 유사하다. 순위 문제는 종종 나오는데, 정확한 순위를 알 수 있는지 여부 문제와 정확한 순위가 무엇인지 문제, 정확한 순위를 알 수 있는 경우의 수 문제가 주어진다. 정확한 순위를 알 수 있는지 true/false : 위상 정렬을 사용하여 판단. 싸이클이 발생하는 경우(큐에서 꺼내는 값의 개수가 0인 경우), 두개 값의 순위 구별이 안되는 경우 (큐에서 꺼내는 값의 수가 두개이상인 경우) 정확한 순위가 무엇인지 : 위상정렬 활용 (위의 경우를 벗어나면 정확한 순위를 알 수 있다...
최종 순위 문제 - 팀별 작년 순위가 주어진다. - 이번 년도에 순위가 바뀐 두 팀이 주어진다. (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..