Post

[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();
	}
}


💾 제출 결과


보러 가기