Last active
January 7, 2026 02:29
-
-
Save kms0219kms/d37888e0206f259f10acfb2d91f89d16 to your computer and use it in GitHub Desktop.
2025-2026 오성고_공동교육_정보과학 Day 3 (화단 길이)
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| # 주어진 화단 둘레의 길이를 사용하여 삼각형 모양의 화단을 만들어야 한다. | |
| # 이때 삼각형 화단의 둘레는 주어진 화단 둘레와 반드시 같아야 하며, | |
| # 화단 둘레의 길이가 9m라면, 다음과 같이 세 가지 경우의 화단을 만들 수 있다. | |
| # 1) 한 변의 길이가 1m, 두 변의 길이가 각각 4m인 화단 | |
| # 2) 한 변의 길이가 2m, 다른 변의 길이가 3m, 나머지 변의 길이가 4m인 화단 | |
| # 3) 세 변의 길이가 모두 3m인 화단 | |
| # 주어진 화단 둘레의 길이를 입력받아 서로 다른 화단의 수를 구하는 프로그램을 작성해 보자. | |
| # 심화: 계산된 화단 모양을 터틀로 모두 출력한다. 각 변의 옆에는 길이도 함께 표시한다. | |
| import turtle | |
| import math | |
| def calculate_angle(a, b, c): | |
| """코사인 법칙을 사용하여 각도를 계산""" | |
| # 각 A (a의 대각) | |
| cos_a = (b**2 + c**2 - a**2) / (2 * b * c) | |
| angle_a = math.acos(max(-1, min(1, cos_a))) * 180 / math.pi | |
| return angle_a | |
| def draw_triangle(turtle_obj, a, b, c, index, total): | |
| """삼각형을 그리고 변의 길이를 표시""" | |
| scale = 30 # 스케일링 (화면에 맞게 조정) | |
| # 삼각형 좌표 계산 | |
| angle_a = calculate_angle(a, b, c) | |
| # 시작 위치 (화면 중앙에 나란히 배치) | |
| turtle_obj.penup() | |
| spacing = 280 | |
| total_width = (total - 1) * spacing | |
| start_x = -total_width / 2 + index * spacing | |
| start_y = 0 | |
| turtle_obj.goto(start_x, start_y) | |
| turtle_obj.pendown() | |
| # 삼각형의 꼭짓점 | |
| points = [(0, 0)] | |
| # 첫 번째 변 (c) | |
| x1 = c * scale | |
| y1 = 0 | |
| points.append((x1, y1)) | |
| # 두 번째 변 (b) | |
| angle_rad = angle_a * math.pi / 180 | |
| x2 = x1 + b * scale * math.cos(math.pi - angle_rad) | |
| y2 = y1 + b * scale * math.sin(math.pi - angle_rad) | |
| points.append((x2, y2)) | |
| # 삼각형 그리기 | |
| turtle_obj.pensize(2) | |
| turtle_obj.color("green") | |
| for i in range(3): | |
| p1 = points[i] | |
| p2 = points[(i + 1) % 3] | |
| turtle_obj.goto(p1[0] + start_x, p1[1] + start_y) | |
| turtle_obj.pendown() | |
| turtle_obj.goto(p2[0] + start_x, p2[1] + start_y) | |
| # 변의 길이 표시 | |
| sides = [c, b, a] | |
| for i in range(3): | |
| p1 = points[i] | |
| p2 = points[(i + 1) % 3] | |
| mid_x = (p1[0] + p2[0]) / 2 + start_x | |
| mid_y = (p1[1] + p2[1]) / 2 + start_y | |
| # 라벨 위치 조정 (바깥쪽으로) | |
| dx = p2[0] - p1[0] | |
| dy = p2[1] - p1[1] | |
| length = math.sqrt(dx**2 + dy**2) | |
| if length > 0: | |
| offset_x = -dy / length * 15 | |
| offset_y = dx / length * 15 | |
| else: | |
| offset_x, offset_y = 0, 0 | |
| turtle_obj.penup() | |
| turtle_obj.goto(mid_x + offset_x, mid_y + offset_y) | |
| turtle_obj.pendown() | |
| turtle_obj.color("blue") | |
| turtle_obj.write(f"{sides[i]}m", align="center", | |
| font=("Arial", 10, "bold")) | |
| turtle_obj.color("green") | |
| # 제목 표시 | |
| turtle_obj.penup() | |
| turtle_obj.goto(start_x, start_y + 80) | |
| turtle_obj.color("black") | |
| turtle_obj.write(f"#{index + 1}: ({a}m, {b}m, {c}m)", | |
| align="center", font=("Arial", 9, "normal")) | |
| def main(): | |
| # 삼각형 조건: 가장 긴 변 < 나머지 두 변의 합 | |
| # a <= b <= c 일 때, c < a + b를 만족해야 함 | |
| perimeter = int(input("화단 둘레의 길이를 입력하세요 (m): ")) | |
| count = 0 | |
| triangles = [] | |
| # a, b, c는 삼각형의 세 변의 길이 (a <= b <= c) | |
| for a in range(1, perimeter): | |
| for b in range(a, perimeter): | |
| c = perimeter - a - b | |
| # c가 b 이상이어야 함 (a <= b <= c) | |
| if c >= b: | |
| # 삼각형 조건 확인: 가장 긴 변 < 나머지 두 변의 합 | |
| if c < a + b: | |
| count += 1 | |
| triangles.append((a, b, c)) | |
| # 터틀 설정 | |
| screen = turtle.Screen() | |
| screen.setup(width=1000, height=800) | |
| screen.bgcolor("white") | |
| screen.title("삼각형 화단 시각화") | |
| turt = turtle.Turtle() | |
| turt.speed(0) | |
| # 모든 삼각형 그리기 | |
| for i, (a, b, c) in enumerate(triangles): | |
| draw_triangle(turt, a, b, c, i, len(triangles)) | |
| turt.hideturtle() | |
| # 안내 메시지 | |
| info_turtle = turtle.Turtle() | |
| info_turtle.speed(0) | |
| info_turtle.penup() | |
| info_turtle.goto(-400, -350) | |
| info_turtle.color("black") | |
| info_turtle.write(f"총 {count}개의 삼각형 화단", font=("Arial", 11, "normal")) | |
| info_turtle.hideturtle() | |
| turtle.done() | |
| if __name__ == "__main__": | |
| main() |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| # 주어진 화단 둘레의 길이를 사용하여 삼각형 모양의 화단을 만들어야 한다. | |
| # 이때 삼각형 화단의 둘레는 주어진 화단 둘레와 반드시 같아야 하며, | |
| # 화단 둘레의 길이가 9m라면, 다음과 같이 세 가지 경우의 화단을 만들 수 있다. | |
| # 1) 한 변의 길이가 1m, 두 변의 길이가 각각 4m인 화단 | |
| # 2) 한 변의 길이가 2m, 다른 변의 길이가 3m, 나머지 변의 길이가 4m인 화단 | |
| # 3) 세 변의 길이가 모두 3m인 화단 | |
| # 주어진 화단 둘레의 길이를 입력받아 서로 다른 화단의 수를 구하는 프로그램을 작성해 보자. | |
| # 삼각형 조건: 가장 긴 변 < 나머지 두 변의 합 | |
| # a <= b <= c 일 때, c < a + b를 만족해야 함 | |
| def main(): | |
| perimeter = int(input("화단 둘레의 길이를 입력하세요 (m): ")) | |
| count = 0 | |
| triangles = [] | |
| # a, b, c는 삼각형의 세 변의 길이 (a <= b <= c) | |
| for a in range(1, perimeter): | |
| for b in range(a, perimeter): | |
| c = perimeter - a - b | |
| # c가 b 이상이어야 함 (a <= b <= c) | |
| if c >= b: | |
| # 삼각형 조건 확인: 가장 긴 변 < 나머지 두 변의 합 | |
| if c < a + b: | |
| count += 1 | |
| triangles.append((a, b, c)) | |
| print(f"\n둘레가 {perimeter}m인 서로 다른 삼각형 화단의 수: {count}개") | |
| print("\n가능한 삼각형 화단의 종류:") | |
| for i, (a, b, c) in enumerate(triangles, 1): | |
| print(f"{i}) 세 변의 길이: {a}m, {b}m, {c}m") | |
| if __name__ == "__main__": | |
| main() |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment