[백준 9546] 3000번 버스 (C#, C++) - soo:bak
작성일 :
문제 링크
설명
각 정류장에서 탑승 인원의 절반과 반 명이 내리는 과정을 거꾸로 추적하여, 맨 처음 버스에 타고 있던 승객 수를 계산하는 문제입니다.
문제는 다음과 같은 조건을 따릅니다:
- 총
k
개의 정류장에서 승객이 내립니다. - 각 정류장에서는 항상 남은 승객의 절반과
0.5
명을 더한 수가 하차합니다. - 하차 후 남은 인원은 다시 절반만 남습니다.
- 마지막 정류장을 지나고 난 후에는 승객이
0명
남아 있어야 합니다.
이 과정을 거꾸로 계산하여, 맨 처음 탑승했던 승객 수를 구해야 합니다.
접근법
각 정류장에서의 하차 규칙은 다음과 같이 해석할 수 있습니다:
- x명이 하차한 후 남은 인원은 전체의 절반이므로,
- 정류장 직전의 인원 수는 \((𝑥 + 0.5) \times 2\)명입니다.
이 구조를 활용하면, 마지막에 남은 인원이 0명
일 때 역순으로 다음과 같은 연산을 반복할 수 있습니다:
- 현재 인원에
0.5
를 더한다. - 그 결과에
2
를 곱하여 이전 정류장에서의 인원을 구한다. 이 연산을 정류장의 수 만큼 반복하면, 맨 처음 버스에 탑승했던 승객 수를 구할 수 있습니다.
Code
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
using System;
class Program {
static void Main() {
int t = int.Parse(Console.ReadLine());
while (t-- > 0) {
int k = int.Parse(Console.ReadLine());
double passenger = 0;
for (int i = 0; i < k; i++)
passenger = (passenger + 0.5) * 2;
Console.WriteLine(passenger);
}
}
}
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
#include <bits/stdc++.h>
using namespace std;
int main() {
ios::sync_with_stdio(false);
cin.tie(nullptr);
int t; cin >> t;
while (t--) {
int n; cin >> n;
double cus = 0;
for (int i = 0; i < n; i++)
cus = (cus + 0.5) * 2;
cout << fixed << setprecision(0) << cus << "\n";
}
return 0;
}