https://www.acmicpc.net/problem/3020
3020번: 개똥벌레
개똥벌레 한 마리가 장애물(석순과 종유석)로 가득찬 동굴에 들어갔다. 동굴의 길이는 N미터이고, 높이는 H미터이다. (N은 짝수) 첫 번째 장애물은 항상 석순이고, 그 다음에는 종유석과 석순이
www.acmicpc.net
문제
코드
import java.io.*;
import java.util.*;
public class Main {
private static final BufferedReader bf = new BufferedReader(new InputStreamReader(System.in));
private static final BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));
public static void main(String[] args) throws IOException {
StringTokenizer st = new StringTokenizer(bf.readLine());
int n = Integer.parseInt(st.nextToken());
int h = Integer.parseInt(st.nextToken());
int[] up = new int[h+1];
int[] down = new int[h+1];
for(int i = 0 ; i < n ; i++) {
int tmp = Integer.parseInt(bf.readLine());
// 인덱스는 장애물의 크기임
// 석순의 장애물 누적
if(i % 2 == 0) down[tmp]++;
// 종유석의 장애물 누적
else up[h - tmp + 1]++;
}
// 종유석과 석순의 장애물 누적
// 종유석은 인덱스가 작은 장애물을 긴 장애물에 더해주고
// (인덱스가 클수록 밑으로 뻗었다는 뜻이니 작은 인덱스를 지나면 큰 인덱스를 무조건 지나게 되기 때문)
// 석순은 큰 장애물을 작은 장애물에 더해줌
// (인덱스가 작을수록 작은 크기의 석순이라는 뜻이니 키 작은 석순을 지나면 키 큰 석순을 무조건 지나게 되기 때문)
for(int i = 1 ; i <= h ; i++) {
up[i] += up[i - 1];
down[h - i] += down[h - i + 1];
}
int ans = 200_000;
int cnt = 0;
for(int i = 1 ; i <= h ; i++) {
// 파괴될 벽의 최소값을 구함
if(up[i] + down[i] < ans) {
cnt = 1;
ans = up[i] + down[i];
}
// 구간의 개수를 구함
else if(up[i] + down[i] == ans) cnt++;
}
// 파괴될 벽의 최소와 그러한 구간 개수
bw.write(ans + " " + cnt);
bf.close();
bw.flush();
bw.close();
}
}
Search
'코딩테스트' 카테고리의 다른 글
[백준] 1424번 '새 앨범' - Java (1) | 2023.08.04 |
---|---|
[백준] 1600번 '말이 되고픈 원숭이' - Java (1) | 2023.08.03 |
[백준] 1253번 '좋다' - Java (1) | 2023.08.01 |
[백준] 1263번 '시간 관리' - Java (1) | 2023.07.31 |
[백준] 5582번 '공통 부분 문자열' - Java (1) | 2023.07.29 |