- 생각
1. 문제를 일고 처음에 이해가 되지 않았는데, 예제를 보고선 도킹을 할 때 현재 번호보다 낮은 번호에만 도킹을 할 수 있다는 사실을 알게되었다.
- 코드
정답 코드 : gate[index] == index 일때만 도킹을 해준다. 도킹을 했을댄 index의 값을 -1해줘서 해당 인덱스에는 다신 도킹할 수 없게 하였다. gate[index] != index 경우에는 해당 게이트보다 낮은 게이트를 재귀로 모두 다 돌아본 다음 도킹 가능한 게이트가 있으면 도킹, index가 0까지 가는 경우 도킹을 종료한다.
import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Comparator;
import java.util.HashSet;
import java.util.LinkedList;
import java.util.PriorityQueue;
import java.util.Queue;
import java.util.StringTokenizer;
public class Main {
static int G, P;
static int[] gate, airplane;
public static void main(String[] args) throws Exception {
SetData();
System.out.println(FindMaxValue());
}
private static void SetData() throws Exception {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
G = Integer.parseInt(br.readLine());
P = Integer.parseInt(br.readLine());
gate = new int[G + 1];
airplane = new int[P + 1];
for (int i = 1; i <= G; i++)
gate[i] = i;
for (int i = 1; i <= P; i++)
airplane[i] = Integer.parseInt(br.readLine());
}
private static int FindMaxValue() {
int count = 0;
for (int i = 1; i <= P; i++) {
if (docking(airplane[i]) < 0)
break;
count++;
}
return count;
}
private static int docking(int index) {
// basecase (게이트 번호의 값이 0이면 도킹 불가)
if (gate[index] == 0) return -1;
if (gate[index] == index) // 도킹을 아직 시도하지 않은 게이트라면
gate[index]--;
else // 도킹을 한 게이트라면 현재 게이트보다 낮은 게이트를 찾기 위해 재귀를 돔.
gate[index] = docking(gate[index]);
return gate[index];
}
}
'algorithm' 카테고리의 다른 글
[JAVA] 백준 2206번 : 벽 부수고 이동하기 (0) | 2020.11.13 |
---|---|
[JAVA] 백준 1517번 : 버블 소트 (0) | 2020.11.12 |
[JAVA] 백준 1700번 : 멀티탭 스케줄링 (0) | 2020.11.09 |
[JAVA] 백준 1202번 : 보석 도둑 (0) | 2020.11.09 |
[JAVA] 백준 15683번 : 감시 (0) | 2020.11.06 |