본문 바로가기
  • Top Genius in the world
알고리듬

[알고리듬] #62 과수원에서

by Mr.Algo 2024. 4. 18.
728x90
반응형

파이썬 실습창을 열 수 있습니다.실습창 열기

 

과수원에서

과수원을 찾아 온 손님이 주인에게 물었습니다.
"주인께서는 올해 나이가 얼마나 되십니까?”

내 나이 말인가?
저기 오는 3사람의 나이를 곱하면 7000이고,
더하면 내 나이의 꼭 2배가 되지.
저 사람들 나이가 나보다 많은 사람은 없어.”

 

“아, 예~”
현명한 손님은 오고 있는 3사람의 나이와 주인의 나이를 알았습니다.

 

당신도 현명합니다.
오고 있는 3사람의 나이와 주인의 나이를 구하여 출력하여 보세요.

 

1. 문제 분석

문제의 핵심 내용을 다시 생각하여 봅시다.

  • 3사람의 나이를 곱하면 7000이다.
  • 3사람의 나이를 더하면 주인 나이의 2배이다.
    그러므로 3사람의 나이 합은 짝수이며  300이하이다(인간의 최대 나이를 150살로 가정).
  • 주인의 나이는 3사람 중에서 나이가 가장 많은 사람과 같거나 더 많다.

그리고, 인간의 나이 한계는 150살로 생각합시다.

그러면 3사람의 나이는 각각 1살 이상(0살이 있으면 곱하여 7000이 될 수 없음) 150살 미만이 됩니다.

 

2. 알고리듬 설계

모든 경우를 조사하는 brute-force algorithm을 사용합시다.

생성과 검정(generate and test)을 반복하는 이 방법은 가장 널리 사용되는 문제 해결 기법(problem-solving technique)이기도 합니다.

 

 

3. 코딩하기

바로 코딩하여 보세요.

더보기
eps=150                                # 나이 한계, eps는 흔히 한계를 표시(epsilon)
for a in range(1,eps):                 # 세 사람을 a, b, c로 둠
    for b in range(a,eps):             # range(a,eps) 답의 중복을 피함(순서 바뀐 나이 발생 않음)
        for c in range(b,eps):
            s=a+b+c                    # 3사람의 나이 합은 8번 줄에서도 사용
            owner=s//2                 # 주인의 나이     
            c1=a*b*c==7000
            c2=(s%2==0) and (s<=300)   # 3사람의 나이합은 짝수이고 300이하
            c3=owner>=max(a,b,c)       # 주인의 나이는 3사람 최대 나이 이상
            if c1 and c2 and c3:
                print(a,b,c,owner)
                
'''
답은 5 35 40 40
세 사람의 나이는 5, 35, 40 살
주인의 나이는 40살

print 다음에 break를 사용하지 않은 것은 또 다른 답이 있을 수 있기 때문입니다.
'''

스스로 하셨지요?

성공을 축하합니다.

오늘 끝.

728x90
반응형