728x90
반응형
2024.09.11기준 - 실버4
728x90
백준, BEAKJOON, BOJ, JAVA, 자바
풀이
이 문제는 하루에 최소 몸무게와 증가 몸무게가 주어질 때, 몇번의 루틴을 진행할 수 있는지 출력하는 문제입니다.
1. 최소몸무게와 몸무게 증가량을 저장해줍니다.
int[] mw = new int[n];
int[] pw = new int[n];
// 최소몸무게 저장
st = new StringTokenizer(br.readLine());
for (int i = 0; i < n; i++) {
mw[i] = Integer.parseInt(st.nextToken());
}
// 몸무게 증가량
st = new StringTokenizer(br.readLine());
for (int i = 0; i < n; i++) {
pw[i] = Integer.parseInt(st.nextToken());
}
2. 날짜에 맞춰 루틴을 진행 횟수를 찾아줍니다.
long ro = 0; // 루틴의 개수
long now = 0; // 현재 몸무게
long count = 0; // 그 날의 루틴 횟수
boolean check;
for (int i = 0; i < n; i++) {
now += pw[i];
// 몸무게가 최소 몸무게보다 작다면
if (now < mw[i]) {
check = ((mw[i] - now) % x) == 0 ? true : false;
// 이 전에 수행한 루틴을 수행하지 않았을 때 유지가 된다면
if (ro >= (check ? ((mw[i] - now) / x) : ((mw[i] - now) / x) + 1)) {
ro -= check ? (mw[i] - now) / x : ((mw[i] - now) / x) + 1;
now += check ? x * ((mw[i] - now) / x) : x * (((mw[i] - now) / x) + 1);
} else { // 이전 루틴을 수행하지 않아도 탈진한다면
ro = -1;
break;
}
} else {
// 최소 몸무게를 만족할 때, 할 수 있는 최대 루틴 수
count = (now - mw[i]) / x;
ro += count;
now -= x * count;
}
- 먼저 증가되는 몸무게를 더 해줍니다.
- 증가된 몸무게를 더 해줄 때 그 날의 최소 몸무게 보다 작다면 2가지 선택지가 주어집니다.
- 이 전에 수행한 루틴을 수행하지 않았을 때 유지가 된다면
- 이전 루틴을 수행하지 않아도 유지할 수 없다면
- 만약 루틴을 수행하지 않고 유지할 수 있다면 다시 루틴을 취소하고 그 만큼 몸무게를 늘려줍니다.
- 하지만 루틴을 수행하지 않고도 유지가 불가능하다면 -1을 출력하고 바로 반복문을 멈춰줍니다.
- 최소 몸무게에 만족한다면 현재 몸무게에서 최대로 진행할 수 있는 루틴 수를 더 해주며 그 만큼 몸무게를 빼줍니다.
코드
package Main;
import java.io.*;
import java.util.*;
public class Main {
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));
StringTokenizer st = new StringTokenizer(br.readLine());
int n = Integer.parseInt(st.nextToken()); // 남은 일 수
int x = Integer.parseInt(st.nextToken()); // 루틴 진행시 빠지는 몸무게
int[] mw = new int[n];
int[] pw = new int[n];
// 최소몸무게 저장
st = new StringTokenizer(br.readLine());
for (int i = 0; i < n; i++) {
mw[i] = Integer.parseInt(st.nextToken());
}
// 몸무게 증가량
st = new StringTokenizer(br.readLine());
for (int i = 0; i < n; i++) {
pw[i] = Integer.parseInt(st.nextToken());
}
long ro = 0; // 루틴의 개수
long now = 0; // 현재 몸무게
long count = 0; // 그 날의 루틴 횟수
boolean check;
for (int i = 0; i < n; i++) {
now += pw[i];
// 몸무게가 최소 몸무게보다 작다면
if (now < mw[i]) {
check = ((mw[i] - now) % x) == 0 ? true : false;
// 이 전에 수행한 루틴을 수행하지 않았을 때 유지가 된다면
if (ro >= (check ? ((mw[i] - now) / x) : ((mw[i] - now) / x) + 1)) {
ro -= check ? (mw[i] - now) / x : ((mw[i] - now) / x) + 1;
now += check ? x * ((mw[i] - now) / x) : x * (((mw[i] - now) / x) + 1);
} else { // 이전 루틴을 수행하지 않아도 탈진한다면
ro = -1;
break;
}
} else {
// 최소 몸무게를 만족할 때, 할 수 있는 최대 루틴 수
count = (now - mw[i]) / x;
ro += count;
now -= x * count;
}
}
bw.write(Long.toString(ro));
bw.flush();
bw.close();
br.close();
}
}
728x90
반응형
'코딩테스트 일기 (BAEKJOON)' 카테고리의 다른 글
BEAKJOON / 백준 - JAVA 25594번 HG 음성기호 (9) | 2024.09.13 |
---|---|
BEAKJOON / 백준 - JAVA 1913번 달팽이 (0) | 2024.09.12 |
BEAKJOON / 백준 - JAVA 25593번 근무 지옥에 빠진 푸앙이 (Small) (0) | 2024.09.10 |
BEAKJOON / 백준 - JAVA 23885번 비숍 투어 (0) | 2024.09.09 |
BEAKJOON / 백준 - JAVA 2448번 별 찍기 - 11 (1) | 2024.09.08 |