WeniVooks

검색

위니브 월드(선생님용)

청소하고 정리합시다!

마지막 문제 ‘병원 설립’은 풀이가 없습니다. 이 문제 풀이가 마지막 문제 풀이입니다. ‘병원 설립’문제는 지금까지 배운 내용을 응용하여 풀어보세요.

1. 챕터의 목표

딕셔너리: 딕셔너리 자료형을 이해하고 key값을 이용하여 value값을 꺼낼 수 있습니다.

2. 스토리

라이캣은 회사가 커질수록 바쁜 경영과 무거운 책임감에 지쳐갔습니다.

“매일이 바람 잘 날 없구냥. 이렇게까지 해야 할까냥? 왜 일을 하느냥? 앞으로 무엇을 더 할까냥?”

라이캣은 온갖 생각이 정리되지 않은 채 캣네생선 가게를 돌아다니며 묵묵히 청소했습니다.

생선가게에는 골드바와 물고기들이 널브러져 있었습니다. 아무 생각 없이 청소할수록 몸은 힘들지만, 머릿속은 정리가 되어갔습니다.

생각은 흘러가는 대로 두고, 단순한 일에 집중하니 머릿속에는 중요한 것만 남고, 문제는 어느새 단순화되었습니다.

2.1 임무

다음과 같은 딕셔너리를 생성하고 골드바의 개수가 몇 개인지, 물고기의 개수가 몇 개인지 터미널에 출력하는 코드를 작성해주세요.

기본 코드
d = {'골드바': 0, '물고기': 0}
d = {'골드바': 0, '물고기': 0}
2.2. 사용 코드

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

d['골드바'] = d['골드바'] + 1
move()
turn_left()
repeat(2, move)
pick()
print('hello world!')
front_is_clear()
left_is_clear()
right_is_clear()
d['골드바'] = d['골드바'] + 1
move()
turn_left()
repeat(2, move)
pick()
print('hello world!')
front_is_clear()
left_is_clear()
right_is_clear()

3. 문제 풀이

3.1 딕셔너리 get

딕셔너리에는 get이라는 메서드가 있습니다. 메서드 목록은 dir을 통해 출력할 수 있습니다. 우리는 딕셔너리에 get을 통해 우리는 좀 더 안전하게 아이템을 추출할 수 있습니다. 예를 들어 보도록 하겠습니다.

d = {'one': 1, 'two': 2}
d['three']
d = {'one': 1, 'two': 2}
d['three']

위의 코드에서 딕셔너리 d에 three가 없기 때문에 KeyError: 'three' 에러를 출력하게 됩니다. 이렇게 키가 없을 때 에러를 출력하지 않고, 설정한 값이 출력되게 하는 것이 get입니다.

d = {'one': 1, 'two': 2}
d.get('three', '값 없음')
d = {'one': 1, 'two': 2}
d.get('three', '값 없음')

위와 같이 출력하면 ‘값 없음’을 출력하게 됩니다. 만약 ‘값 없음’이 아니라 0을 출력하게 하고 싶었다면 아래와 같이 코드를 수정하면 됩니다.

d = {'one': 1, 'two': 2}
d.get('three', 0)
d = {'one': 1, 'two': 2}
d.get('three', 0)

3.2 문제 풀이
Before After

우선 아래 아이템이 있으면 줍고, 비어있는 공간으로 지속해서 이동하는 함수를 만들어보도록 하겠습니다.

def moving():
    while True:
        if on_item():
            pick()
        if front_is_clear():
            move()
        elif right_is_clear():
            repeat(3, turn_left)
            move()
        elif left_is_clear():
            turn_left()
            move()
        else:
            break
def moving():
    while True:
        if on_item():
            pick()
        if front_is_clear():
            move()
        elif right_is_clear():
            repeat(3, turn_left)
            move()
        elif left_is_clear():
            turn_left()
            move()
        else:
            break

위 코드는 while True이기 때문에 무한 반복합니다. 앞과 양옆이 막혀있을 때까지요. 조건문에 의해 앞이 막혀있고 양옆이 막혀있으면 break 문으로 무한 반복을 탈출합니다.

이렇게 선언된 함수를 사용해 모든 아이템을 다 줍습니다.

mission_start()
 
result = {'골드바': 0, '물고기': 0}
def moving():
    while True:
        if on_item():
            pick()
        if front_is_clear():
            move()
        elif right_is_clear():
            repeat(3, turn_left)
            move()
        elif left_is_clear():
            turn_left()
            move()
        else:
            break
moving()
 
mission_end()
mission_start()
 
result = {'골드바': 0, '물고기': 0}
def moving():
    while True:
        if on_item():
            pick()
        if front_is_clear():
            move()
        elif right_is_clear():
            repeat(3, turn_left)
            move()
        elif left_is_clear():
            turn_left()
            move()
        else:
            break
moving()
 
mission_end()

아이템을 다 주웠다면 골드 바와 물고기에 정리해 넣는 코드를 작성합니다. fish-1, fish-2, fish-3는 모두 result의 물고기에 담겨야 합니다.

result['물고기'] += item().get('fish-1', 0)
result['물고기'] += item().get('fish-2', 0)
result['물고기'] += item().get('fish-3', 0)
result['골드바'] += item().get('goldbar', 0)
result['물고기'] += item().get('fish-1', 0)
result['물고기'] += item().get('fish-2', 0)
result['물고기'] += item().get('fish-3', 0)
result['골드바'] += item().get('goldbar', 0)

이제 결과를 출력하기만 하면 됩니다.

print(f'골드바는 {result["골드바"]}개 있습니다. 물고기는 {result["물고기"]}마리 있습니다.')
print(f'골드바는 {result["골드바"]}개 있습니다. 물고기는 {result["물고기"]}마리 있습니다.')

이렇게 모든 문제를 풀어보았습니다.

4. 정답 코드

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

mission_start()
 
result = {'골드바': 0, '물고기': 0}
def moving():
    while True:
        if on_item():
            pick()
        if front_is_clear():
            move()
        elif right_is_clear():
            repeat(3, turn_left)
            move()
        elif left_is_clear():
            turn_left()
            move()
        else:
            break
moving()
result['물고기'] += item().get('fish-1', 0)
result['물고기'] += item().get('fish-2', 0)
result['물고기'] += item().get('fish-3', 0)
result['골드바'] += item().get('goldbar', 0)
print(f'골드바는 {result["골드바"]}개 있습니다. 물고기는 {result["물고기"]}마리 있습니다.')
 
mission_end()
mission_start()
 
result = {'골드바': 0, '물고기': 0}
def moving():
    while True:
        if on_item():
            pick()
        if front_is_clear():
            move()
        elif right_is_clear():
            repeat(3, turn_left)
            move()
        elif left_is_clear():
            turn_left()
            move()
        else:
            break
moving()
result['물고기'] += item().get('fish-1', 0)
result['물고기'] += item().get('fish-2', 0)
result['물고기'] += item().get('fish-3', 0)
result['골드바'] += item().get('goldbar', 0)
print(f'골드바는 {result["골드바"]}개 있습니다. 물고기는 {result["물고기"]}마리 있습니다.')
 
mission_end()
2.9 자동화하자!3장 명령어 사전