작성일 :

문제 링크

11131번 - Balancing Weights

설명

물리학의 돌림힘(Torque)을 활용하여, 추가 달린 레버가 어느 방향으로 기울어질지 판단하는 문제입니다.


돌림힘이란 어떤 물체를 회전시키는 힘을 나타내며, 다음과 같이 정의됩니다.

τ = F * r * sinθ, (r은 회전축에서 힘의 작용점까지의 거리, F 는 가해진 힘, θ 는 힘의 방향과 r 사이의 각도)


문제에서는 모든 추의 무게 작용점에 대하여 θ90으로 동일하며, 질량에 작용하는 가속도는 동일하다는 전제가 있습니다.

따라서, 힘 F 는 질량 m * 가속도 a 로 표현되므로, 가속도 a 가 일정하다면,

단순히 τ = m * d , (m 은 추의 질량, d 는 회전축에서 힘의 작용점까지의 거리) 로 돌림힘을 계산할 수 있습니다.


따라서, 입력으로 주어지는 각 추의 무게에 대한 돌림힘을 모두 합산하여, 총 돌림힘을 계산하여 레버가 어느 방향으로 회전할지 결정하여 출력합니다.

돌림힘의 총합이 0 이면, 균형 상태("Equilibrium"), 양수이면 오른쪽("Right"), 음수이면 왼쪽("Left") 으로 회전합니다.


Code

[ C# ]

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
namespace Solution {
  class Program {
    static void Main(string[] args) {

      var cntCase = int.Parse(Console.ReadLine()!);

      for (int t = 0; t < cntCase; t++) {
        var n = int.Parse(Console.ReadLine()!);

        var w = Console.ReadLine()!.Split(' ').Select(int.Parse).ToArray();

        int torque = 0;
        for (int i = 0; i < n; i++)
          torque += 100 * w[i];

        if (torque == 0) Console.WriteLine("Equilibrium");
        else if (torque > 0) Console.WriteLine("Right");
        else Console.WriteLine("Left");
      }

    }
  }
}



[ C++ ]

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
#include <bits/stdc++.h>

using namespace std;

int main() {
  ios::sync_with_stdio(false);
  cin.tie(nullptr);

  int cntCase; cin >> cntCase;

  for (int t = 0; t < cntCase; t++) {
    int n; cin >> n;

    vector<int> w(n);
    for (int i = 0; i < n; i++)
      cin >> w[i];

    int torque = 0;
    for (int i = 0; i < n; i++)
      torque += 100 * w[i];

    if (torque == 0) cout << "Equilibrium\n";
    else if (torque > 0) cout << "Right\n";
    else cout << "Left\n";
  }

  return 0;
}