728x90
반응형
2024.09.16기준 - 실버3
728x90
백준, BEAKJOON, BOJ, JAVA, 자바
풀이
이 문제는 우울한 날에 대비해서 꽃을 선물할 때, 가장 많은 꽃을 줄 수 있는 날을 출력하는 문제입니다.
문제 접근
- 우울 기간 중 최장 우울 기간을 구하며, 그 최장 우울 기간의 개수를 구합니다.
- 최장 우울 기간이 많다면 모든 경우의 수를 계산해 가장 많이 꽃을 줄 수 있는 날을 출력합니다.
- 우울한 날에도 꽃을 선물할 수 있다는 것이 많은 도움이되는 포인트였던거 같습니다.
1. 입력받은 상범이의 기분을 저장하면서 연속된 우울의 날을 저장해줍니다.
int[] arr = new int[n]; // 입력받은 상범이의 기분을 저장하는 배열
int[] dearr = new int[n]; // 연속된 우울 날을 저장하는 배열
int count = 0;
for (int i = 0; i < n; i++) {
arr[i] = Integer.parseInt(st.nextToken());
// 우울하다면 count 업
if (arr[i] < 0) {
count++;
// 우울한 날이 끝나면 길이를 저장.
} else {
dearr[i - count] = count;
count = 0;
}
}
// 마지막 날이 우울한 날이라면 우울한 날을 저장하지 않기 때문에 다시 확인
if (count != 0) {
dearr[n - count] = count;
count = 0;
}
// 최장 우울 기간을 저장하는 변수
int max = 0;
for (int num : dearr) {
max = Math.max(max, num);
}
2. 최장 우울 기간과 개수를 구합니다.
// 최장 우울 기간을 저장하는 변수
int max = 0;
for (int num : dearr) {
max = Math.max(max, num);
}
// 최장 우울 기간의 개수
int maxcount = 0;
for (int num : dearr) {
if (num == max) {
maxcount++;
}
}
3. 최장 우울기간만큼 반복문을 돌려 가장 많은 꽃을 줄 수 있는 날짜를 구합니다.
int result = 0;
int turn;
// 최장 우울기간이 많다면 전부 다 탐색
for (int i = 0; i < maxcount; i++) {
visit = new boolean[n];
turn = i; // 몇 번째 우울 기간을 3T로 잡을 지 결정하는 변수.
for (int j = 0; j < n; j++) {
if (max == dearr[j] && turn == 0) { // 최장이면서 3T로 할 우울 기간
turn--;
check(j, dearr[j], true);
} else if (max == dearr[j]) { // 최장이지만 2T로 할 우울 기간
turn--;
check(j, dearr[j], false);
} else { // 최장 기간이 아닌 우울 기간
check(j, dearr[j], false);
}
}
count = 0;
for (boolean bo : visit) {
if (bo) {
count++;
}
}
result = Math.max(result, count);
}
함수를 생성해 꽃을 주는 날을 true로 체크를 해주면서 count를 세어주었습니다.
// 꽃을 선물해 주는 날을 체크하는 함수.
// boolean check : 3T로 할지 2T로 할지 결정하는 변수.
private static void check(int index, int len, boolean check) {
int checklen = check ? 3 * len : 2 * len;
// 꽃을 줘야 되는 날을 true로 체크
for (int i = 1; i <= checklen; i++) {
if (index - i >= 0) {
visit[index - i] = true;
}
}
}
- 아규먼트 boolean check에 true로 들어온다면 3T의 시간을 소모할 수 있다는 의미로 생성했습니다.
- 현재 날에 기준으로 2T 또는 3T 동안 꽃을 줄 수 있기 때문에 현재 인덱스에서 줄 수 있는 날을 빼면서 true로 변환해줍니다.
- 체크를 끝낸 boolean[] 에서 ture의 count를 세어주어 제일 많이 주는 날을 출력해줍니다.
코드
package Main;
import java.io.*;
import java.util.*;
public class Main {
static boolean[] visit;
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));
int n = Integer.parseInt(br.readLine()); // 예측한 날의 수
StringTokenizer st = new StringTokenizer(br.readLine());
int[] arr = new int[n]; // 입력받은 상범이의 기분을 저장하는 배열
int[] dearr = new int[n]; // 연속된 우울 날을 저장하는 배열
int count = 0;
for (int i = 0; i < n; i++) {
arr[i] = Integer.parseInt(st.nextToken());
// 우울하다면 count 업
if (arr[i] < 0) {
count++;
// 우울한 날이 끝나면 길이를 저장.
} else {
dearr[i - count] = count;
count = 0;
}
}
// 마지막 날이 우울한 날이라면 우울한 날을 저장하지 않기 때문에 다시 확인
if (count != 0) {
dearr[n - count] = count;
count = 0;
}
// 최장 우울 기간을 저장하는 변수
int max = 0;
for (int num : dearr) {
max = Math.max(max, num);
}
// 최장 우울 기간의 개수
int maxcount = 0;
for (int num : dearr) {
if (num == max) {
maxcount++;
}
}
int result = 0;
int turn;
// 최장 우울기간이 많다면 전부 다 탐색
for (int i = 0; i < maxcount; i++) {
visit = new boolean[n];
turn = i; // 몇 번째 우울 기간을 3T로 잡을 지 결정하는 변수.
for (int j = 0; j < n; j++) {
if (max == dearr[j] && turn == 0) { // 최장이면서 3T로 할 우울 기간
turn--;
check(j, dearr[j], true);
} else if (max == dearr[j]) { // 최장이지만 2T로 할 우울 기간
turn--;
check(j, dearr[j], false);
} else { // 최장 기간이 아닌 우울 기간
check(j, dearr[j], false);
}
}
count = 0;
for (boolean bo : visit) {
if (bo) {
count++;
}
}
result = Math.max(result, count);
}
bw.write(Integer.toString(result));
bw.flush();
bw.close();
br.close();
}
// 꽃을 선물해 주는 날을 체크하는 함수.
// boolean check : 3T로 할지 2T로 할지 결정하는 변수.
private static void check(int index, int len, boolean check) {
int checklen = check ? 3 * len : 2 * len;
// 꽃을 줘야 되는 날을 true로 체크
for (int i = 1; i <= checklen; i++) {
if (index - i >= 0) {
visit[index - i] = true;
}
}
}
}
728x90
반응형
'코딩테스트 일기 (BAEKJOON)' 카테고리의 다른 글
BEAKJOON / 백준 - JAVA 18127번 모형결정 (0) | 2024.09.18 |
---|---|
BEAKJOON / 백준 - JAVA 1043번 거짓말 (1) | 2024.09.17 |
BEAKJOON / 백준 - JAVA 17070번 파이프 옮기기 1 (0) | 2024.09.15 |
BEAKJOON / 백준 - JAVA 10703번 유성 (1) | 2024.09.14 |
BEAKJOON / 백준 - JAVA 25594번 HG 음성기호 (9) | 2024.09.13 |