(BOJ6322 직각 삼각형의 두 변
문제 설명
- 삼각형의 두 변이 주어졌을 때, 나머지 한 변의 길이를 구해야 한다.
- 다만, 각 변의 위치를 고정시켰기 때문에 많은 경우의 수를 탐색할 필요가 없고
- 출력에만 주의를 기울이면 되는 문제이다.
문제 풀이
Python
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
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)
}
- 제곱에는 위의 함수를 정의하여 활용했다.
- 기본 정수형 제곱을 위한 함수가 없고,
- 정수의 제곱을 실수로 활용해야 하기 때문에,
- 정수를 받아 실수를 반환하는 함수로 만들었다.