작성일 :

문제 링크

9546번 - 3000번 버스

설명

각 정류장에서 탑승 인원의 절반과 반 명이 내리는 과정을 거꾸로 추적하여, 맨 처음 버스에 타고 있던 승객 수를 계산하는 문제입니다.

문제는 다음과 같은 조건을 따릅니다:

  • 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;
}