[BOJ/백준] 5190번 : Aerospace & Mechanical Engineering (Java)
📘 백준 5190번 : Aerospace & Mechanical Engineering
💡 문제 풀이
물리 공식 정리
가속도:
[ a = \frac{F}{m} - g ]거리 증가량:
[ \Delta h = v \cdot t + \frac{1}{2} \cdot a \cdot t^2 ]속도 증가량:
[ v = v + a \cdot t ]
여기서 ( v )는 해당 스테이지 시작 시점의 속도이고,
( m )은 현재까지 남아 있는 로켓과 연료 탱크들의 무게 합이다.
사용 변수 정리
변수명 | 의미 | 타입 | 비고 |
---|---|---|---|
n |
로켓의 단계 수 | int |
1 이상 30 이하 |
M |
로켓 본체의 무게 (마지막까지 남는 무게) | double |
항상 0보다 큼 |
m[i] |
i번째 스테이지의 무게 | double |
총 무게 계산에 사용 |
t[i] |
i번째 스테이지의 연소 시간 (초 단위) | double |
거리, 속도 누적 시 사용 |
F[i] |
i번째 스테이지의 추력 (kg·m/s²) | double |
가속도 계산에 사용 |
allM |
현재까지 남아 있는 총 질량 | double |
초기값은 M + 모든 m[i] 의 합 |
a |
순가속도 (추력 기반 가속도 - 중력가속도) | double |
a = F[i] / allM - 9.81 |
v |
현재 속도 (m/s) | double |
매 스테이지마다 누적 갱신 |
h |
현재까지 누적된 고도 (거리, m 단위) | double |
최종 출력 값 |
✅ 코드 (Java)
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
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.StringTokenizer;
// https://www.acmicpc.net/problem/5190
// 해당 단 동안 로켓이 상승한 거리 = v * t + 0.5 * a * t * t
// 속도 증가량(v) = v + a * t
// 순가속도(a) = 해당 단의 추력 / 해당 단포함 무게 - 중력가속도
public class B5190_Aerospace_and_Mechanical_Engineering {
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
StringBuilder sb = new StringBuilder();
int K = Integer.parseInt(br.readLine()); // 데이터 세트
for (int ds = 1; ds <= K; ds++) {
sb.append("Data Set ").append(ds).append(":\n"); // 출력 형식
StringTokenizer st = new StringTokenizer(br.readLine());
int n = Integer.parseInt(st.nextToken()); // 로켓 단(stage) 개수
double M = Double.parseDouble(st.nextToken()); // 로켓 본체 무게
double[] m = new double[n]; // 단마다의 무계
double[] t = new double[n]; // 단이 작동하는 시간
double[] F = new double[n]; // 단이 작동 중 생성하는 추력(힘)
double allM = M; // 남은 단의 무게의 합
for (int i = 0; i < n; i++) { // 단의 정보 입력
st = new StringTokenizer(br.readLine());
m[i] = Double.parseDouble(st.nextToken());
t[i] = Double.parseDouble(st.nextToken());
F[i] = Double.parseDouble(st.nextToken());
allM += m[i];
}
double v = 0; // 속도 증가량
double h = 0; // 누적 높이
for (int i = 0; i < n; i++) {
double a = F[i] / allM - 9.81; // 순가속도
h += v * t[i] + 0.5 * a * t[i] * t[i]; // 높이 계산
v = v + a * t[i]; // 속도 변화 계산
allM -= m[i]; // 분리된 단 무게 제외
}
sb.append(String.format("%.2f\n", h)); // 출력 저장
}
System.out.println(sb); // 출력
br.close();
}
}