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

[알고리듬] #59 버스에 탄 어린이

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

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

진달래

 

 

버스에 탄 어린이

 

어느 버스의 어린이 요금은 800원이고, 어른 요금은 1100원입니다.
그런데 버스에 탄 승객 15명의 요금이 13500원이었습니다.
어린이와 어른은 몇 명이 탔을까요?

 

1. 문제 분석

어린이와 어른의 인원수는 1이상 15이하인 양의 정수인 것을 알 수 있습니다.

 

2. 알고리듬 설계

2-1 brute-force method(저돌적 방법)

모든 경우를 조사하는 방법을 생각하여 봅시다.

어린이가 1명이고 어른이 1명인 경우, 어린이가 1명이고 어른이 2명인 경우, ... , 어린이가 1명이고 어른이 15명인 경우.
어린이가 2명이고 어른이 1명인 경우, 어린이가 2명이고 어른이 2명인 경우, ... , 어린이가 2명이고 어른이 15명인 경우.
:
:
어린이가 15명이고 어른이 1명인 경우, 어린이가 15명이고 어른이 2명인 경우, ... , 어린이가 15명이고 어른이 15명인 경우.

 

이렇게 모든 경우를 조사하면 문제가 해결될 것 같습니다.

 

※   brute-force method(저돌적 방법)이란?

’저돌적(猪突的)’은 ‘앞뒤를 생각하지 않고 내닫거나 덤비는 것’이라는 뜻입니다.

한자의 저는 돼지 저(저팔계의 저), 돌은 부딪힐 돌(돌격의 돌)이고, 영어의 brute 는 돼지, force는 덤비는 것(폭력)입니다.

즉, 돼지가 부딪칠 듯 한 기세로 맹렬히 달려드는 모습을 표현한 말입니다.

실제로 산돼지는 목표를 정하면 직선으로 무조건 달려들어서 바위나 나무에 부딛혀서 죽기도 합니다.

컴퓨터에서는 무식하게(?) 모든 경우를 다 조사하는 방법을 일컫는 말입니다. 그런데 실제는 매우 유식한 방법입니다.

 

2-2 창의적 방법

꾀가 많은 꾀돌이는 다음과 같이 생각했습니다.

  • 어린이는 800원, 어른은 1100원, 전체 인원은 15명, 전체 요금은 13500원이다.
  • 만약, 15명 전체가 어린이면 전체 요금은 12000원(=800*15) 이어야 한다. 그런데 13500이다.
  • 실제 전체 요금인 13500원과 1500원 차이( =13500-12000)가 난다.  이유는 어른이 탔기 때문이다.
  • 어른이 몇 명 탔을까? 어른 한 명은 어린이에 비해서 요금을 300원 더 낸다 (=1100-800).
    그러므로 차이 나는 1500원은 300원을 더 내는 어른이 5명(=1500//300) 탔기 때문이다.
  • 어린이의 수는 전체 15명에서 어른의 수 5명을 뺀 10명이다.

와우! 역시 똑똑한 꾀돌이.

 

3. 코딩하기

3-1 brute-force 방법으로 코딩

저돌적으로 도전하여 보세요.

더보기
n=15
for kids in range(1,n+1):
    for adult in range(1,n+1):
        if kids+adult==n and kids*800+adult*1100==13500:
            print(kids,adult)
            
'''
답은 어린이 10명, 어른 5명입니다.

4번 줄의 if 다음의 조건식이 조금 긴것 같습니다.
이렇게 바꿀 수 있습니다.
n=15
for kids in range(1,n+1):
    for adult in range(1,n+1):
        c1=kids+adult==n                # 조건 1  
        c2=kids*800+adult*1100==13500   # 조건 2
        if c1 and c2:                   # 조건 1과 조건 2가 모두 참이면 
            print(kids,adult)
            break                       # 불필요한 진행 중단
            
물론 다음과 같이 코딩할 수도 있습니다.
n=15
for kids in range(1,n+1):
    adult=n-kids
    if kids*800+adult*1100==13500:
        print(kids,adult)
        break 
'''

 

3-2  창의적 방법

창의적 방법으로 코딩하여 보세요.

더보기
n=15
adult=(13500-12000)//300
kids=n-adult
print(kids,adult)

 

4. 조금 더 좋게

이 문제를 해결하려면 꼭 알아야할 정보는 무엇일까요?

버스의 어린이 요금, 어른 요금, 승객의 수 그리고 전체 요금입니다.

이러한 문제해결에 꼭 필요한 정보를 입력(input)이라 합니다.

프로그램의 앞부분에 모든 입력정보를  적어놓으면 더 좋은 코딩이 됩니다.

다음은 예입니다.

fa,fb,n,tot=800,1100,15,13500   # 어린이 요금, 어른 요금, 인원수, 전체 요금
for kids in range(n+1):         # 상식적이지 않지만 어린이 0명도 고려하였음 
    adult=n-kids
    if kids*fa+adult*fb==tot:
        print(kids,adult)
        break
        
'''
창의적 방법은 다음과 같아 코딩할 수 있습니다.
n=15
adult=(tot-n*fa)//(fb-fa)
kids=n-adult
print(kids,adult)
'''

 

더 있어(?) 보이지요?

실제로 더 좋은 코드가 되었습니다.

 

오늘도 수고하셨습니다.안녕!

728x90
반응형