실버2
최소 길이는 1이고, 최대 길이는 랜선의 최대 길이다.
1부터 최대 길이까지 이분 탐색으로 현재 길이가 N개 이상의 랜선을 만들 수 있는지 확인하고, 그 최댓값을 출력하면 된다.
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
StringTokenizer st = new StringTokenizer(br.readLine());
int K = Integer.parseInt(st.nextToken());
int N = Integer.parseInt(st.nextToken());
long lines[] = new long[N];
long start =1, end = 0;
for (int i = 0; i < K; i++) {
lines[i] = Long.parseLong(br.readLine());
end = Math.max(end, lines[i]);
}
long ans = Long.MIN_VALUE;
while (start <= end) {
long mid= start + (end - start)/2;
if (isSolution(lines, mid, N)) {
start = mid + 1;
ans = Math.max(mid, ans);
} else {
end = mid - 1;
}
}
System.out.println(end);
}
private static boolean isSolution(long lines[], long target, int K) {
int ans = 0;
for (long line : lines) {
ans += line / target;
}
return ans >= K;
}
습관적으로 start
을 0부터 시작해서 division by zero 에러가 발생했다
골드3
방문 배열(boolean[]
)을 사용하여 학생의 방문 여부를 관리하고, 탐색 완료 배열(boolean[]
)을 사용하여 학생에 대한 탐색이 완료되었는지 관리한다
아직 방문하지 않은 학생에 대해 DFS 탐색을 실시한다 visited[node] = true;
int next = students[node];
static
변수에 더한다DFS가 모두 완료되면 전체 학생 수에서 사이클에 포함되는 학생 수를 빼서 출력한다
실버1
A is B
의 형태로 주어진다A is B
면서 C is B
일 수는 있지만, A is B
면서 A is C
일 수는 없다A is B
에 대해 키 A
에 값을 B
를 갖는 HashMap<Character, Caharacter map
을 저장한다실버4
그리디 풀이
가장 큰 가로등 간 거리를 구하고, 이를 2로 나눈 값
이진 탐색 풀이
1부터 N까지 이진탐색으로 굴다리 전체를 비출 수 있는 높이를 구한다
end = mid - 1
start = mid + 1
while (start <= end) {
int mid = start + (end - start)/2;
boolean success = check(mid, N, locs);
if (success) {
ans = mid;
end = mid - 1;
} else {
start = mid + 1;
}
}
조건 충족은 다음과 같이 확인한다