Skip to content

Instantly share code, notes, and snippets.

@kms0219kms
Last active January 7, 2026 02:29
Show Gist options
  • Select an option

  • Save kms0219kms/d37888e0206f259f10acfb2d91f89d16 to your computer and use it in GitHub Desktop.

Select an option

Save kms0219kms/d37888e0206f259f10acfb2d91f89d16 to your computer and use it in GitHub Desktop.
2025-2026 오성고_공동교육_정보과학 Day 3 (화단 길이)
# 주어진 화단 둘레의 길이를 사용하여 삼각형 모양의 화단을 만들어야 한다.
# 이때 삼각형 화단의 둘레는 주어진 화단 둘레와 반드시 같아야 하며,
# 화단 둘레의 길이가 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()
# 주어진 화단 둘레의 길이를 사용하여 삼각형 모양의 화단을 만들어야 한다.
# 이때 삼각형 화단의 둘레는 주어진 화단 둘레와 반드시 같아야 하며,
# 화단 둘레의 길이가 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