WeniVooks

검색

위니브 월드(선생님용)

무료 밥차

1. 챕터의 목표

조건문: if, elif, else문을 사용할 수 있습니다.

논리 연산: and, or, not 연산을 할 수 있습니다.

2. 스토리

라이캣은 그동안 라이언 타운 바깥으로 은밀하게 금괴를 이동시켜왔습니다.

'라이언 타운에서 1골드는 간식을 살 돈이지만 위니브월드에선 10가족이 10달을 먹고 살 수 있는 돈이다냥!'

그는 믿을만한 직원들을 선별하여 이동시킨 금괴로 식자재를 구매하여 오랜 기간 밥차를 운영했습니다.

"먹는 문제는 내가 해결해주겠다냥! 먹을 것을 걱정 말고, 입을 것을 걱정 말고, 잘 곳을 걱정 말고 더 큰 가치를 위해 시간을 써라냥!"

누가 그 밥차를 운영하는지 대부분은 몰랐지만, 많은 이들이 그 밥차를 기다려왔고 감사해왔습니다. 그렇게 어떤 이는 성장하고, 실력을 키워 누가 그 밥차를 운영하는지 알게 되었고 은밀히 그를 따르게 되었습니다.

그중에서도 하티는 자신이 태어난 마을에 오랫동안 밥차가 왔었다는 것을 알고 있었습니다.

캣네생선에서 첩자 활동을 하며 누가 그 밥차를 운영하는지 알게 되었고 그가 보여주었던 진심, 그가 보여주었던 행동으로 하티의 마음이 흔들리고 있었습니다.

2.1 임무

fish-1이 10마리 이상, goldbar가 10개 이상이면 밥차를 운영하는 (1, 4) 공간으로 들어갑니다. 그리고 fish-1을 한 마리 놓고 밥차를 운영한다고 말해주세요.

fish-1이 10마리 미만, goldbar가 10개 미만이면 밥차를 운영하는 (1, 4) 공간에서 밥차를 운영하지 않는다고 말해야 합니다. 두 조건이 동시 만족되어야 합니다.

2.1.1 기본 코드
if 조건:
    say('오늘은 밥차를 운영합니다!')
else:
    say('오늘은 밥차를 운영하지 않습니다!')
if 조건:
    say('오늘은 밥차를 운영합니다!')
else:
    say('오늘은 밥차를 운영하지 않습니다!')
2.2 사용 코드

아래 코드들을 조합하여 문제를 풀어주세요.

mission_start()
mission_end()
True and False
True or False
10 > 5 and False
move()
repeat(2, move)
pick()
say('hello world!')
show_item()
show_item()['fish-1']
10 > 20
30 < 10
10 >= 5
3 == 3
3 != 5
5 <= 10
mission_start()
mission_end()
True and False
True or False
10 > 5 and False
move()
repeat(2, move)
pick()
say('hello world!')
show_item()
show_item()['fish-1']
10 > 20
30 < 10
10 >= 5
3 == 3
3 != 5
5 <= 10

3. 문제 풀이

3.1 조건문

조건문은 해당 조건이 True일 때, 그 아래 if 범위에 있는 코드를 실행시키는 것입니다.

print('start')
if True:
    print('hello')
    print('hello')
    print('hello')
print('end')
print('start')
if True:
    print('hello')
    print('hello')
    print('hello')
print('end')

코드의 범위는 위 네모 박스 버튼을 눌러 확인할 수 있습니다. 접힌 곳까지가 if문의 범위입니다. 범위는 띄어쓰기 4칸으로 나타냅니다.

if문의 조건을 True로 했을 때와 False로 했을 때 각각 출력 결과를 확인해 보도록 하겠습니다.

start
hello
hello
hello
end
start
hello
hello
hello
end
start
end
start
end

if문이 False일 때 실행하게 하는 것이 else 구문입니다. 아래 구문을 확인해 볼게요.

print('start')
if True:
    print('hello')
else:
    print('world')
print('end')
print('start')
if True:
    print('hello')
else:
    print('world')
print('end')

위 구문에서 if문 뒤가 True이면 ‘hello’를, False라면 ‘world’를 출력합니다. if는 단독으로 사용할 수 있지만 else는 단독으로 사용할 수 없습니다. 조건문에는 if와 else뿐만 아니라 elif도 있습니다.

x = 10
if x > 10:
    print('x는 10보다 큽니다')
elif x == 10:
    print('x는 10입니다.')
else:
    print('x는 10보다 작습니다.')
x = 10
if x > 10:
    print('x는 10보다 큽니다')
elif x == 10:
    print('x는 10입니다.')
else:
    print('x는 10보다 작습니다.')

elif는 else if의 줄임말입니다. 그렇지 않고 만약이라는 뜻으로 앞의 조건문이 False이고 뒤에 값이 True라면 실행하는 것이죠. elif는 아래와 같이 여러 개를 사용할 수 있습니다.

x = 76
if x >= 90:
    print('A')
elif x >= 80:
    print('B')
elif x >= 70:
    print('C')
else:
    print('D')
x = 76
if x >= 90:
    print('A')
elif x >= 80:
    print('B')
elif x >= 70:
    print('C')
else:
    print('D')

여기서 x는 순차적으로 조건문이 참인지 거짓인지를 검사하게 됩니다. 첫 번째 if문에서 x는 90점 이상이 아니기 때문에 False값으로 다음 코드로 넘어가게 됩니다. 두 번째 elif문에서 x는 80점 이상도 아니기 때문에 다음 코드로 넘어가게 됩니다. 세 번째 elif문에서 x는 70점 이상이기 때문에 C를 출력하고 그 뒤 else문으로는 넘어가지 않습니다. 이미 앞에서 True인 것이 나왔기 때문입니다.

논리 연산은 평소에 다루던 연산이 아니기 때문에 생소하고 어렵지만 컴퓨터 공학에서는 필수로 다뤄야 하는 개념이며 자주 사용되는 개념입니다. 따라서 반복하여 자연스럽게 사용할 수 있도록 해주세요. 아래처럼 정리하면 좋습니다.

# True는 1, False는 0
# and는 곱, or는 합
# not은 부정
True and False # 첫번째 예제
True or False # 두번째 예제
True or True # 세번째 예제
not True # 네번째 예제
# True는 1, False는 0
# and는 곱, or는 합
# not은 부정
True and False # 첫번째 예제
True or False # 두번째 예제
True or True # 세번째 예제
not True # 네번째 예제

첫 번째 예제에서 True and False는 1 곱하기 0과 같습니다. 곱하기이니 둘 중 하나라도 0이라면 0이겠죠? 그래서 and 연산은 둘 중 하나라도 False라면 False를 반환합니다. 이 예제는 뒤의 값이 False이니 False를 반환합니다.

두 번째 예제에서 True or False는 1 더하기 0과 같습니다. 더하기이니 둘 중 하나라도 1이라면 1 이상일 것입니다. 그래서 or 연산은 둘 중 하나라도 True라면 True를 반환합니다. 이 예제는 앞의 값이 이미 True이니 True를 반환합니다.

세 번째 예제는 1 더하기 1이 되는데요. 0외에 다른 숫자는 모두 True 취급한다고 생각해 주시면 됩니다.

네 번째 예제에서 not True라면 False를 not False이면 True를 출력합니다.

쉽게 설명하기 위해 더하기와 곱하기에 대입하여 위 문제를 풀어보았습니다. 다만 실제 파이썬은 위와 같이 연산하는 것이 아니라 문장들을 평가해가며 연산합니다. 예를 들어 앞에 False가 나오고 and가 나왔다면 뒤에 문장은 보지 않고 False로 평가합니다.


3.2 문제 풀이

우리의 미션은 아이템을 다 줍고 문 앞에서 문을 열고 들어가, 물고기 1마리를 놓고 밥차 운영 여부를 말하는 것입니다.

Before After

우선 앞으로 이동하면서 모든 아이템을 다 줍습니다.

mission_start()
 
move()
repeat(12, pick)
move()
repeat(15, pick)
 
mission_end()
mission_start()
 
move()
repeat(12, pick)
move()
repeat(15, pick)
 
mission_end()

그리고 문 앞까지 이동합니다.

mission_start()
 
repeat(3, turn_left)
move()
turn_left()
move()
 
mission_end()
mission_start()
 
repeat(3, turn_left)
move()
turn_left()
move()
 
mission_end()

이동해서 문을 열고 앞으로 이동하여 fish-1이 10개 이상이면서 동시에 goldbar가 10개 이상이면 fish-1을 내려놓고 '오늘은 밥차를 운영합니다!'라고 말합니다. 그렇지 않으면 '오늘은 밥차를 하지 않습니다!'라고 말합니다.

mission_start()
 
open_door()
move()
 
if(item()['fish-1'] >= 10 and item()['goldbar'] >= 10):
    put('fish-1')
    say('오늘은 밥차를 운영합니다!')
else:
    say('오늘은 밥차를 하지 않습니다!')
 
mission_end()
mission_start()
 
open_door()
move()
 
if(item()['fish-1'] >= 10 and item()['goldbar'] >= 10):
    put('fish-1')
    say('오늘은 밥차를 운영합니다!')
else:
    say('오늘은 밥차를 하지 않습니다!')
 
mission_end()

여기서 조건이 and가 아니라 or일 경우는 어떻게 될까요? 둘 중 하나만 만족해도 밥차를 운영하게 됩니다.

4. 정답 코드

초기화 후 한 번에 실행시킬 수 있는 정답 코드입니다.

mission_start()
 
move()
repeat(12, pick)
move()
repeat(15, pick)
 
repeat(3, turn_left)
move()
turn_left()
move()
open_door()
move()
 
if(item()['fish-1'] >= 10 and item()['goldbar'] >= 10):
    put('fish-1')
    say('오늘은 밥차를 운영합니다!')
else:
    say('오늘은 밥차를 하지 않습니다!')
 
mission_end()
mission_start()
 
move()
repeat(12, pick)
move()
repeat(15, pick)
 
repeat(3, turn_left)
move()
turn_left()
move()
open_door()
move()
 
if(item()['fish-1'] >= 10 and item()['goldbar'] >= 10):
    put('fish-1')
    say('오늘은 밥차를 운영합니다!')
else:
    say('오늘은 밥차를 하지 않습니다!')
 
mission_end()
2.6 여기는 은행인가 생선가게인가2.8 창고 통합