이 문제에서는 두 값 S와 N이 주어집니다. S는 강물의 흐름 속도(km/h)를 나타내고, N은 상류 방향과 하류 방향으로 이동할 때 걸리는 시간의 비율을 나타냅니다. 우리가 해야 할 일은 이 두 값을 이용해 노를 젓는 사람의 실제 이동 속도를 구하는 것입니다.
먼저 예시를 통해 문제를 이해해 보겠습니다.
입력
S = 5, N = 2
출력
15
풀이 접근법
이 문제는 배 젓기(rowing) 문제에 널리 쓰이는 수학적 관계식을 활용하면 간단히 해결할 수 있습니다. 그럼 공식이 어떻게 도출되는지 단계별로 살펴보겠습니다.
사람의 속도 = x km/h 강물의 흐름 속도 = S km/h 하류 방향(흐름을 따라 내려갈 때) 속도 = (x + S) km/h 상류 방향(흐름을 거슬러 올라갈 때) 속도 = (x - S) km/h 하류로 일정한 거리를 이동하는 데 걸리는 시간 = T 상류로 같은 거리를 이동하는 데 걸리는 시간 = n × T 하류 이동 거리 = (x + S) × T 상류 이동 거리 = (x - S) × n × T 두 거리가 서로 같으므로, (x + S) × T = (x - S) × n × T x + S = nx - nS S + nS = nx - x S × (n + 1) = x × (n - 1)
위 식을 정리하면 사람의 이동 속도 x는 다음과 같이 계산됩니다.
x = S × (n + 1) / (n − 1)
이 풀이가 실제로 동작하는 모습을 보여주는 프로그램입니다.
예제
#include <iostream>
using namespace std;
float calcManSpeed(float S, int n) {
return (S * (n + 1) / (n - 1));
}
int main() {
float S = 12;
int n = 3;
cout<<"사람의 속도는 "<<calcManSpeed(S, n)<<" km/hr";
return 0;
}
출력
사람의 속도는 24 km/hr
위 예제에서 강물의 흐름 속도 S는 12km/h, 상·하류 이동 시간 비율 n은 3입니다. 공식에 대입하면 12 × (3 + 1) ÷ (3 − 1) = 12 × 4 ÷ 2 = 24km/h가 되어, 사람의 이동 속도는 24km/h임을 알 수 있습니다.