(BOJ6322 직각 삼각형의 두 변

Link copied to clipboard

문제 설명

Link copied to clipboard
  • 삼각형의 두 변이 주어졌을 때, 나머지 한 변의 길이를 구해야 한다.
    • 다만, 각 변의 위치를 고정시켰기 때문에 많은 경우의 수를 탐색할 필요가 없고
    • 출력에만 주의를 기울이면 되는 문제이다.

문제 풀이

Link copied to clipboard

Python

Link copied to clipboard
triangle_num = 1
ans = []
while True:
    a, b, c = map(int, input().split())
    if a == b == c == 0:
        break
    tmp = f"Triangle #{triangle_num}\n"
    triangle_num += 1
    if c == -1:
        tmp += "c = %.3f\n" % ((a**2 + b**2) ** 0.5)
    elif a == -1:
        if b >= c:
            tmp += "Impossible.\n"
        else:
            tmp += "a = %.3f\n" % ((c**2 - b**2) ** 0.5)
    elif b == -1:
        if a >= c:
            tmp += "Impossible.\n"
        else:
            tmp += "b = %.3f\n" % ((c**2 - a**2) ** 0.5)
    ans.append(tmp)
print("\n".join(ans))
  • ans리스트에 모든 정답을 넣은 후 한번에 출력했다.
  • while문 반복하며 종료조건을 확인하고,
  • 먼저 출력 첫줄과 입력 번호를 작업했다.
  • 그 다음 입력을 주어진 조건에 따라 구분하여 확인하는데,
    • c를 구해야 한다면 다른 두 변의 제곱을 더한 후 제곱근을 출력하고,
    • a 또는 b를 구하는 경우
      • c가 최대 길이 변이 아니면 불가능하므로 Impossible. 출력
      • 아니라면 피타고라스 정리를 활용하여 출력한다.
    • 그리고 각 길이는 소수점 3자리까지 출력한다.
print(f"a = {a: .3f}")
  • 위의 코드에서 f-string과 문자열 포매팅을 복합적으로 사용했다.
  • 처음에는 모든 출력을 위롸 같이 f-string으로 했는데, 출력 형태가 잘못되었다고 여러차례 오답을 받았다.
  • 정확히 어떤 부분이 문제인지는 모르겠지만, 다른 풀이에서도 f-stirng을 사용 한 것을 찾지 못하여 문자열 포매팅 부분에서 추가적인 수정을 하지 않았다.

Go

Link copied to clipboard
end := [3]int{0, 0, 0}
triangleNum := 1
for {
    nums := nextInts()
    if nums == end {
        break
    }
    fmt.Fprintf(wr, "Triangle #%d\n", triangleNum)
    triangleNum++
    if nums[2] == -1 {
        fmt.Fprintf(wr, "c = %.3f\n", math.Sqrt(IntPow(nums[0])+IntPow(nums[1])))
    } else if nums[0] == -1 {
        if nums[1] >= nums[2] {
            fmt.Fprint(wr, "Impossible.\n")
        } else {
            fmt.Fprintf(wr, "a = %.3f\n", math.Sqrt(IntPow(nums[2])-IntPow(nums[1])))
        }
    } else if nums[1] == -1 {
        if nums[0] >= nums[2] {
            fmt.Fprint(wr, "Impossible.\n")
        } else {
            fmt.Fprintf(wr, "b = %.3f\n", math.Sqrt(IntPow(nums[2])-IntPow(nums[0])))
        }
    }
    fmt.Fprint(wr, "\n")
}
  • for 문으로 무한 반복문을 구성하고, fmt.Fprintf()를 사용하여 문자열 포매팅 출력을 했다.
func IntPow(x int) float64 {
    return float64(x * x)
}
  • 제곱에는 위의 함수를 정의하여 활용했다.
    • 기본 정수형 제곱을 위한 함수가 없고,
    • 정수의 제곱을 실수로 활용해야 하기 때문에,
    • 정수를 받아 실수를 반환하는 함수로 만들었다.