해골섬으로 향하는 라이캣
1. 챕터의 목표
변수
: 변수를 할당할 수 있습니다.
출력
: print()를 사용해 터미널에 값을 출력할 수 있습니다.
변수의 타입
: type()
을 통하여 변수의 타입을 확인할 수 있습니다.
2. 스토리
라이언 타운에 잠입을 성공한 캣은 빠르게 기반을 잡았습니다. 캣은 위니브월드에서 가장 고기가 많이 잡히는 해골 섬에서 고기를 잡을 수 있는 몇 안 되는 용감한 어부이기 때문이었어요. 그 이름에도 알 수 있듯이 해골 섬은 암초가 많고 물살이 거세 수많은 어부들이 목숨을 잃었던 곳이기도 했습니다.
캣은 물고기의 움직임을 파악하고, 지도를 만들고, 암초에도 배가 침몰하지 않도록 아래 철판을 덧대고, 좀 더 좋은 실로 그물을 다시 만들었습니다.
"이제 출항이다냥!"
2.1 임무
미로를 피해 모든 물고기
를 잡고, 잡은 물고기의 수를 **라이캣은 물고기 3마리를 잡았다!**와 같이 터미널에 출력해야 합니다!
2.2.1 사용 코드
아래 코드들을 조합하여 문제를 풀어주세요.
mission_start()
mission_end()
move()
turn_left()
repeat(2, move)
pick()
print('hello world!')
print('hello', 'world')
print(f'hello world')
item()
item()['fish-1']
mission_start()
mission_end()
move()
turn_left()
repeat(2, move)
pick()
print('hello world!')
print('hello', 'world')
print(f'hello world')
item()
item()['fish-1']
2.2.2 중급자의 사용 코드
if
while
in
character_data[0]['x']
character_data[0]['y']
item_data
if
while
in
character_data[0]['x']
character_data[0]['y']
item_data
3. 문제 풀이
3.1 변수
변수는 어떤 값을 가리킬 때 사용합니다. 변수를 사용하기 위해서 이름을 정하고 =
기호를 이용하여 값을 할당하면 됩니다. =
는 대입 연산자라고 합니다.
물고기의 개수를 나타낼 변수를 선언해보겠습니다. 이렇게 변수를 이용하면 값을 쉽게 가져올 수 있습니다.
count = 0
print(count)
count = 0
print(count)
반드시 알아야 하는 변수명 규칙
- 변수명은 한글, 영문자나 _ (언더스코어)로 시작해야 합니다.
- 대문자와 소문자는 다르게 구분합니다. 예를 들면, Apple 과 apple은 다른 변수명입니다.
- 파이썬에서 이미 사용되고 있는 변수나 키워드를 예약어라고 하는데 이 예약어를 사용하는 변수명을 사용해서는 안됩니다. 예를 들면, for나 def와 같은 이미 사용되고 있는 단어는 변수명으로 사용해선 안됩니다.
- 변수명에서 띄어쓰기는 허용하지 않습니다. 띄어쓰고 싶다면 언더바나(스네이크 표기법) 중간에 대문자를 사용하는 방식(카멜 표기법)으로 사용합니다. 파이썬에서는 언더바를 표준 스타일로 정하고 있습니다. (count_fish)
3.2 산술연산
이 문제에서는 잡은 물고기를 누적해야 하므로 산술연산을 알아야 합니다. 산술 연산은 더하기, 빼기, 곱하기, 나누기, 나머지에 관한 연산자입니다. 각 기능에 대해서는 주석으로 달아두도록 하겠습니다. 코드 오른쪽에 있는 #
뒤의 텍스트는 실행되지 않습니다. 이처럼 실행되지 않지만, 코드에 대한 설명을 추가할 때 넣는 텍스트를 주석이라고 합니다.
count = 10
print(count + 3) # 더하기
print(count - 3) # 빼기
print(count / 3) # 나누기(실수)
print(count // 3) # 나누기(정수, 내림)
print(count * 3) # 곱하기
print(count ** 3) # 승수
print(count % 3) # 나머지
count = 10
print(count + 3) # 더하기
print(count - 3) # 빼기
print(count / 3) # 나누기(실수)
print(count // 3) # 나누기(정수, 내림)
print(count * 3) # 곱하기
print(count ** 3) # 승수
print(count % 3) # 나머지
별표라고 표현하는 특수문자의 공식 이름은 애스터리스크(*
)입니다. 애스터리스크가 1개이면 곱셈, 2개이면 승수가 됩니다. count가 현재 10이니 count ** 3
은 10을 3번 곱하는 10 * 10 * 10
이 됩니다.
print(count * 3) # 곱하기
print(count ** 3) # 승수
print(count * 3) # 곱하기
print(count ** 3) # 승수
나누기에는 두 종류가 있습니다. 슬래시를 1개(/
) 하게 되면 3.333…
처럼 소수점까지 출력합니다. 이렇게 소수점이 있는 형태를 실수형(float, 플로트형)이라고 부릅니다. 슬래시가 2개(//
) 있으면 3
처럼 정수를 출력합니다. 이렇게 소수점이 없는 숫자를 정수형(int, 인트형)이라고 부릅니다.
print(count / 3) # 나누기(실수)
print(count // 3) # 나누기(정수, 내림)
print(count / 3) # 나누기(실수)
print(count // 3) # 나누기(정수, 내림)
각 타입은 아래와 같이 확인이 가능합니다.
print(type(3.33))
print(type(3))
print(type(3.33))
print(type(3))
나머지 연산으로 나눗셈의 나머지 값을 얻을 수 있습니다. 10을 3으로 나누었을 때 몫이 3이고 나머지가 1이므로 1이 출력됩니다. 나머지 연산은 생소하겠지만 앞으로도 많이 사용하게 되니 꼭 기억해 주세요.
print(count % 3) # 나머지
print(count % 3) # 나머지
다시 물고기 변수를 선언하던 코드로 돌아오도록 하겠습니다.
count = 0
count = 0
위 코드에서 물고기 1마리를 잡을 때마다 1개씩 증가시키려면 아래와 같은 코드가 필요합니다. 대입 연산(=
)보다 더하기가 먼저 계산됩니다. 따라서 count + 1
의 결과인 1이 count에 저장됩니다.
count = count + 1
count = count + 1
이 코드는 아래와 같이 줄일 수 있으나, 처음에는 이렇게 줄이는 코드가 익숙지 않으니 위 코드를 주로 사용하겠습니다. 다만 실무에서는 아래 형태의 코드를 더 많이 사용합니다.
count += 1
count += 1
3.2 문제 풀이
Before | After |
---|---|
이 문제는 자동화한 코드를 사용하지 않습니다. 추후 앞이 비어있는지 확인하는 front_is_clear()
나 발아래 아이템이 있는지 확인하는 on_item()
그리고 반복문인 while 등을 조합하여 사용한다면 더욱 우아한 풀이가 가능합니다.
우선 첫번째 줄에 있는 물고기를 모두 먹어보도록 하겠습니다. 이때 물고기 먹는 수를 세야 하는데요. 이 숫자를 저장하기 위한 변수를 선언합니다. 월드를 사용하지 않을 예정이면 mission_start()
, mission_end()
를 제외해주세요.
count = 0
count = 0
선언된 변수는 위에서 배운 것처럼 산술 연산을 할 수 있습니다. 이제 물고기를 잡아가면서 변수를 하나씩 증가시켜보도록 하겠습니다. 위에서 이미 count = 0을 선언하여서 아래 코드에는 count 변수는 없습니다. 다만 만약 위에 count = 0을 선언하지 않았다면 주석을 풀고 실행시켜주세요.
mission_start()
# count = 0
move()
pick()
count = count + 1
print(count)
mission_end()
mission_start()
# count = 0
move()
pick()
count = count + 1
print(count)
mission_end()
위 코드를 실행하게 되면 한 칸 이동 후 물고기 한 마리를 잡았을 것이고, 터미널에는 1이라고 출력이 되었을 것입니다. 이런 식으로 나머지 물고기 전체를 잡는 코드를 작성하면 됩니다. 물고기 1마리를 더 잡고 오른쪽으로 도는 코드까지만 작성해 보도록 하겠습니다.
mission_start()
repeat(2, move)
pick()
count = count + 1
move()
repeat(3, turn_left)
mission_end()
mission_start()
repeat(2, move)
pick()
count = count + 1
move()
repeat(3, turn_left)
mission_end()
물고기를 다 잡았다면 라이캣은 물고기 3마리를 잡았다!
와 같이 출력해야 합니다. print()
함수를 사용해서 아래와 같이 출력할 수 있습니다.
count = 3
print('라이캣은 물고기 3마리를 잡았다!')
print('라이캣은 물고기 ', 3, '마리를 잡았다!')
print('라이캣은 물고기 ', count, '마리를 잡았다!')
print(f'라이캣은 물고기 {count}마리를 잡았다!')
count = 3
print('라이캣은 물고기 3마리를 잡았다!')
print('라이캣은 물고기 ', 3, '마리를 잡았다!')
print('라이캣은 물고기 ', count, '마리를 잡았다!')
print(f'라이캣은 물고기 {count}마리를 잡았다!')
위 출력 결과는 모두 라이캣은 물고기 3마리를 잡았다!
로 동일합니다. 마지막에 사용한 방법이 **f-string 용법(에프-스트링 용법)**입니다. 변수를 직접 삽입하여 보다 편리하게 사용할 수 있고 실무에서도 많이 사용하는 방법이니 반드시 숙지해 주시기 바랍니다.
4. 정답 코드
초기화 후 한 번에 실행시킬 수 있는 정답 코드입니다.
mission_start()
count = 0
move()
pick()
count = count + 1
repeat(2, move)
pick()
count = count + 1
move()
repeat(3, turn_left)
repeat(2, move)
pick()
count = count + 1
repeat(2, move)
repeat(3, turn_left)
repeat(3, move)
pick()
count = count + 1
move()
pick()
count = count + 1
repeat(3, turn_left)
repeat(2, move)
pick()
count = count + 1
repeat(2, move)
print(f'라이캣은 물고기 {count}마리를 잡았다!')
mission_end()
mission_start()
count = 0
move()
pick()
count = count + 1
repeat(2, move)
pick()
count = count + 1
move()
repeat(3, turn_left)
repeat(2, move)
pick()
count = count + 1
repeat(2, move)
repeat(3, turn_left)
repeat(3, move)
pick()
count = count + 1
move()
pick()
count = count + 1
repeat(3, turn_left)
repeat(2, move)
pick()
count = count + 1
repeat(2, move)
print(f'라이캣은 물고기 {count}마리를 잡았다!')
mission_end()
5. 심화 코드
중고급 심화 과정 학생들이 다룰 수 있는 코드입니다. 심화 코드는 여러 개념을 복합 설명해야 하므로 설명을 덧붙이지 않습니다.
def move_pick():
move()
if on_item():
pick()
mission_start()
repeat(4, move_pick)
repeat(3, turn_left)
repeat(4, move_pick)
repeat(3, turn_left)
repeat(4, move_pick)
repeat(3, turn_left)
repeat(4, move_pick)
repeat(3, turn_left)
print(f'라이켓은 물고기 {item()["fish-1"]}마리를 잡았다!')
mission_end()
def move_pick():
move()
if on_item():
pick()
mission_start()
repeat(4, move_pick)
repeat(3, turn_left)
repeat(4, move_pick)
repeat(3, turn_left)
repeat(4, move_pick)
repeat(3, turn_left)
repeat(4, move_pick)
repeat(3, turn_left)
print(f'라이켓은 물고기 {item()["fish-1"]}마리를 잡았다!')
mission_end()
from modules import turn_left_until_clear, turn_right
mission_start()
visited = []
while True:
visited.append((character_data[0]['x'], character_data[0]['y']))
if front_is_clear():
move()
while on_item():
pick()
else:
turn_right()
move()
if (character_data[0]['x'], character_data[0]['y']) in visited:
break
print('라이캣은 물고기 ', item()['fish-1'], '마리를 잡았다!')
mission_end()
from modules import turn_left_until_clear, turn_right
mission_start()
visited = []
while True:
visited.append((character_data[0]['x'], character_data[0]['y']))
if front_is_clear():
move()
while on_item():
pick()
else:
turn_right()
move()
if (character_data[0]['x'], character_data[0]['y']) in visited:
break
print('라이캣은 물고기 ', item()['fish-1'], '마리를 잡았다!')
mission_end()