파이썬 실습창을 열 수 있습니다.실습창 열기
버스에 탄 어린이
어느 버스의 어린이 요금은 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)
'''
더 있어(?) 보이지요?
실제로 더 좋은 코드가 되었습니다.
오늘도 수고하셨습니다.안녕!
'알고리듬' 카테고리의 다른 글
[알고리듬] #61 100마리의 닭 (0) | 2024.04.18 |
---|---|
[알고리듬] #60 노새와 당나귀 (0) | 2024.04.17 |
[알고리듬] #58 A와 B의 관계 (0) | 2024.04.17 |
[알고리듬] #57 크리스마스 선물 (0) | 2024.04.16 |
[알고리듬] #56 테일러 급수 (2) | 2024.04.16 |