[문제출처 : Codechef] 스네이프 교수는 많은 마법약을 가지고 있습니다. 그래서 그 마법약들이 천장까지 찬장에 쌓여있습니다. 현재 사용하고 있는 사다리로는 약들을 꺼내기가 어려워 새로운 사다리를 만들려고 합니다. 하지만 아쉽게도 다이애건 앨리에 갈 시간은 없네요.. 그래서 스네이프 교수는 론에게 사다리를 아래와 같은 모양으로 만들라고 시켰습니다.
img
LS와 B가 주어졌을 때, 론이 만들 수 있는 사다리의 RS 길이는 어떤 범위를 가질까요?

이 문제는 사실 프로그래밍 보다는 수학 문제에 가깝습니다. 하지만 알고리즘적인 생각을 도울 수 있기 때문에 한번 풀어보죠 :)

일단 LS와 B는 고정되어 있습니다. 그리고 사다리의 특성상 RS와 B가 둔각을 이룰수는 없습니다.(최대 직각입니다.) 그렇다면 쉽게 두 가지 극단적인 직각삼각형을 생각해 볼 수 있습니다.

  • LS와 B가 직각을 이루는 경우에, RS가 가장 깁니다.
  • RS와 B가 직각을 이루는 경우에, RS가 가장 짧습니다.

따라서 이를 함수로 구현하면,

def findRSRange(B, LS):
    minimum = (LS**2 - B**2)**0.5
    maximum = (LS**2 + B**2)**0.5
    return minimum, maximum

>>> print findRSRange(4, 5)
(3.0, 6.4031242374328485)
>>> print findRSRange(10, 12)
(6.6332495807108, 15.620499351813308)
>>> print findRSRange(10, 20)
(17.320508075688775, 22.360679774997898)

간단한 수학문제 풀이였습니다 :)