🔺 문제
20207번: 달력
수현이는 일년의 날짜가 1일부터 365일로 표시되어있는 달력을 가지고있다. 수현이는 너무나도 계획적인 사람이라 올 해 일정을 모두 계획해서 달력에 표시해놨다. 여름이 거의 끝나가자 장
www.acmicpc.net
🧩 해결 아이디어
• 구현
- 구간을 입력받고, 해당 시작점부터 끝점까지 구간을 색칠한다.
→ 카운트 배열 사용 - 카운트 배열을 돌면서 해당 칸의 값이 0이 아니라면 너비 + 1하고 높이는 최대 높이와 비교해 더 큰 값으로 갱신한다.
/ 해당 칸의 값이 0이라면, 여태까지 구한 너비와 최대 높이를 구해 넓이 값에 누적해 저장하고, 너비와 최대 높이는 0으로 초기화한다. - ⭐ 마지막 구간 처리를 위해 마지막에 넓이들의 합에 너비 * 최대 높이 구한 값을 더해줘야 한다!!
💥 유의사항
마지막 구간 처리를 놓치면 안 된다. 😱
그럼 1%에서 틀리는 불상사 발생,,
🔺 코드
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
|
import java.util.*;
import java.io.*;
public class Main {
static int DAY_OF_YEAR = 365;
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
StringTokenizer st;
int N = Integer.parseInt(br.readLine());
int[] cntArr = new int[DAY_OF_YEAR + 1]; // 카운팅 배열
while(N --> 0) {
st = new StringTokenizer(br.readLine(), " ");
int from = Integer.parseInt(st.nextToken());
int to = Integer.parseInt(st.nextToken());
// 구간 색칠하기
for(int i = from ; i <= to ; i++) {
cntArr[i]++;
}
}
int total = 0;
int w = 0;
int maxH = 0;
for(int i = 0 ; i <= DAY_OF_YEAR ; i++) {
if(cntArr[i] != 0) {
w++;
maxH = Math.max(maxH, cntArr[i]);
}
else {
total += w * maxH;
// 너비와 최대 높이 초기화
w = 0;
maxH = 0;
}
}
total += w * maxH; // 마지막꺼 처리 !!
System.out.println(total);
}
}
|
cs |
🔺 다른 풀이들
우선순위 큐 사용하셔서 정렬하시고 하는 풀이도 있었는데,
이 문제에서 정렬은 필요하지 않다고 생각돼서 링크를 달진 않겠다..
💬 느낀 점
단순 구현이라 어려운 문제는 아닌데 카운팅 정렬 쓸 생각을 45분만에 했고,
코드 작성하고 에러 잡는데 40분? 걸린 것 같다.
게시판에 올라온 반례도 심지어 다 맞길래 뭐지-하고 다른 분들 코드를 참고했다ㅠ
문제 조건에 정렬이 있길래 정렬해야 하나? 했는데 정렬할 필요 없고,
그냥 지나간 횟수 누적해주면 되는 것이었다.
그리고 마지막 구간 처리까지 놓치면 안 되는!!
담에는 더 빨리 생각해서 잘 풀어보겠다,,,
1회독 | 2회독 | 3회독 | 4회독 | 5회독 |
V |
(참고)
[자바] 백준 20207 - 달력 (java)
문제 : boj20207 필요 알고리즘 개념 그리디 매번 통하는 일정한 규칙을 정해서, 해당 규칙을 따르면 원하는 답을 구할 수 있는걸 말한다. 보통 엄밀히 증명되기 보다는 '이렇게 하면 될 것 같은데?'
nahwasa.com
백준 20207 - 달력(Java)
www.acmicpc.net/problem/20207 20207번: 달력 수현이는 일년의 날짜가 1일부터 365일로 표시되어있는 달력을 가지고있다. 수현이는 너무나도 계획적인 사람이라 올 해 일정을 모두 계획해서 달력에 표시해
moons-memo.tistory.com
'코테 > 백준' 카테고리의 다른 글
[백준/JAVA] 15787번: 기차가 어둠을 헤치고 은하수를 (0) | 2023.12.16 |
---|---|
[백준/JAVA] 16637번: 괄호 추가하기 (0) | 2023.12.14 |
[백준/JAVA] 14503번: 로봇 청소기 (0) | 2023.12.13 |
[백준/JAVA] 1913번: 달팽이 (0) | 2023.12.13 |
[백준/JAVA] 4396번: 지뢰 찾기 (0) | 2023.12.13 |