본문 바로가기
IT

스위프트 플레이그라운드(Swift Playgrounds) Learn to Code 1 Ch. 4 Conditional Code 풀이

by 수완킴 2021. 3. 6.
반응형

이번 주는 Learn to Code 1에서 Conditional Code(조건문)를 배워볼 겁니다.
들어가기에 앞서 이제까지 배워본 내용을 한 번 복습해봅시다.
두 번째 시간에 배웠던 Functions(함수)는 정의되어 있지 않은 행동을 컴퓨터에게 먼저 알려주는 역할을 했었죠.
예를 들어 Byte가 모르는 turnRight(오른쪽으로 회전)을 알려주기 위해서는
func turnRight() {
turnLeft()
turnLeft()
turnLeft()
}
위와 같이 Function으로 정의하면 됩니다. 그다음부터는 turnRight()만 입력해도 알아서 (왼쪽으로 세 번 돌아 최종적으로는) 오른쪽으로 돌죠.
지난주에 익혔던 For Loops(For 반복문)로는 특정 행동을 지정한 횟수만큼 반복할 수 있습니다.
만약에 앞으로 두 칸 가서 Gem을 줍는 행동을 3번 반복하고 싶다면?
for i in 1 ... 3 {
moveForward()
moveForward()
collectGem()
}
을 입력하면 되는 거죠.
이 개념들을 떠올리면서 Conditional Code(조건문)를 학습해봅시다. 참고로 조건문은 if와 else if를 사용합니다. if만 입력해도 condition(조건)란에 입력할 조건들이 미리보기로 나옵니다. 아래처럼요.


1. Checking for Swithes
목표 : if를 이용하여 꺼져있는 스위치만 켜기
풀이 : Byte의 두 칸 앞에 세 개의 스위치가 있습니다. 이 스위치가 켜져 있을지 꺼져있을지는 랜덤입니다. 이런 상태에서 문제를 해결하기 위해서 사람에게 명령한다면 이렇게 되겠죠.
'만약 스위치가 꺼져있으면 켜라'
컴퓨터가 알아듣게 말하려면 if 뒤 condition(조건)란에 isOnClosedSwitch를 입력하고, {} 안에 toggleSwitch()를 쓰면 됩니다. 이렇게요.
if isOnClosedSwitch {
toggleSwitch()
}
또한 스위치의 간격이 일정하므로, 조건문을 세 번 입력하기보다는 For Loops에 If문을 넣으면 더 편할 것 같군요.
답 :
moveForward()
for i in 1 ... 3 {
moveForward()
if isOnClosedSwitch() {
toggleSwitch()
}
}

2. Using else if
목표 : if와 else if로 스위치를 켜거나 Gem을 줍기
풀이 : 첫 번째 문제처럼 앞에 놓인 두 칸의 상태는 랜덤입니다. 주워야 하는 Gem이 두 개 있을 수도 있고, 꺼져있는 스위치가 2개 일 수도 있죠.

위와 같은 상태에서 문제를 해결하기 위해 사람에게 명령한다면 아래와 같이 말하면 되겠죠.
'꺼져있는 스위치가 있으면 켜고,
Gem이 있으면 주워'
이걸 Byte가 알아듣게 하려면
전자는 if로, 후자는 else if로 작성하면 됩니다.
답 :
for i in 1 ... 2 {
moveForward()
if isOnClosedSwitch {
toggleSwitch()
}
else if isOnGem {
collectGem()
}
}

3. Looping Conditional Code
목표 : For반복문에 If를 넣어서 스위치를 켜거나 Gem을 얻기
풀이 : 원래 서있었던 칸에서 6칸, 순간이동해서 6칸을 이동하면 되기에 12번 특정 행동을 반복하면 됩니다.
답 :
for i in 1 ... 12 {
moveForward()
if isOnClosedSwitch {
toggleSwitch()
}
else if isOnGem {
collectGem()
}
}

4. Conditional Climb
목표 : if 조건문을 이용하여 Gem 4개를 얻기
풀이 :
맵과 미리 작성되어 있는 구문은 이러합니다.

반복되는 패턴을 읽어내는 게 중요합니다.
Gem이 있는 칸에서는 Gem을 줍고 왼쪽으로 돌고(if)
그게 아니면 앞으로 가면 되겠죠(else)
이를 토대로 빈칸을 채워봅시다.
답 :
for i in 1 ... 16 {
if isOnGem {
collectGem()
turnLeft()
}
else {
moveForward()
}
}

5. Defining Smarter Functions
목표 : 함수, 반복문, 조건문을 사용해서 Gem을 얻거나 스위치를 켜기
풀이 :

1)
func collectOrToggle() {
Tap to enter code
}
위와 같이 함수가 미리 작성되어 있습니다.
Tap to enter code에 조건문을 넣어서 미리 정의(func)합시다.
2)
Gem이나 스위치가 나타나는 위치에 패턴이 보입니다.
한 줄에 두 칸 앞으로 가서 collectOrToggle()하는 행동을 두 번 반복하면 되는데요,
이걸 For 반복문을 써서 미리 정의(함수)해두면 편할 것 같습니다.
답 :
func collectOrToggle() {
if isOnClosedSwitch {
toggleSwitch()
}
else if isOnGem {
collectGem()
}
func TwoMMCOT() {
for i in 1 ... 2 {
moveForward()
moveForward()
collectOrToggle()
}
TwoMMCOT()
turnLeft()
moveForward()
moveForward()
turnLeft()
TwoMMCOT()
turnRight()
moveForward()
turnRight()
TwoMMCOT()

6. Boxed In
목표 : 조건문, 함수, 반복문을 사용해서 Gem을 얻거나 스위치를 켜기
힌트 :
1) 한 칸 단위로 움직이지 말고 두 칸 단위로 생각하며 가야 합니다(8번이 아니라 4번 반복해야 합니다)
2) 한가운데가 아니라 모서리의 한 지점을 시작점으로 두어야 합니다.
답 :
func collectortoggle() {
if isOnClosedSwitch {
toggleSwitch()
}
else if isOnGem {
collectGem()
}
moveForward()
turnRight()
for i in 1 ... 4 {
moveForward()
collectortoggle()
turnRight()
moveForward()
collectortoggle()
}

7. Decision Tree
목표 : Gem 6개를 얻고 스위치 3개를 다 켜기
풀이 :
참고로 이번에 Gem의 On/Off와 스위치의 Close/Open는 랜덤이 아닙니다. 즉, 고정되어있다는 뜻.   
맵을 이리저리 돌려보면 패턴이 보일 겁니다.
패턴을 발견하기 힘들면 이미 제시된 예시를 잘 읽어봅시다.
for i in 1 ... 5 {
moveForward()
if isOnGem {
solveRightSide()
}
else if isOnColosedSwitch() {
solveLeftSide()
}
}
이걸 토대로 문제를 해결하면 됩니다.
1) Gem이 있으면
오른쪽 문제를 해결(solveRightSide)하고
(Gem옆에 오른쪽으로 내려가는 계단이 있으니까)
2) 꺼진 스위치가 있으면
왼쪽 문제를 해결(solveLeftSide)하면 됩니다.
(스위치 옆에 왼쪽으로 블록이 튀어나와 있으니까)
결론적으로 solveRightSide와 solveLeftSide를 정의(func)한 뒤에
예시문(조건문이 있는 반복문)을 그대로 옮겨 적으면 되겠죠.
Tip 1 돌아 나오는 액션이 반복되니까 turnAround()를 정의하면 편하겠죠.
Tip 2 결과값이 실행된 다음에는 반드시 원래 길(주황색으로 표시된 부분)로 돌아오도록 해야 합니다.

답 :
func turnAround() {
turnLeft()
turnLeft()
}
func solveRightSide() {
collectGem()
turnRight()
moveForward()
moveForward()
moveForward()
turnLeft()
moveForward()
collectGem()
turnAround()
moveForward()
turnRight()
moveForward()
moveForward()
moveForward()
turnRight()
}
func solveLeftSide() {
toggleSwitch()
turnLeft()
moveForward()
collectGem()
turnAround()
moveForward()
turnLeft()
}
for i in 1 ... 5 {
moveForward()
if isOnGem {
solveRightSide()
}
else if isOnColosedSwitch() {
solveLeftSide()
}
}

마치며
if와 else if도 지난주에 배웠던 For Loops(For 반복문)처럼 소개만 읽었을 때는 이해하기가 어려울 수 있기 때문에, 문제를 풀면서 개념을 익히는 게 좋을 듯합니다. 세문제 정도만 풀어봐도 감이 잡힐 겁니다.
오늘 배운 내용을 정리해보면 이렇습니다.
1) 두 가지 조건을 넣으려면 처음은 if로, 그다음부터는 else if를 넣으면 됩니다.
2) 다음에 내걸 조건이 첫 조건과 정반대라면 else만 써도 됩니다.
점점 이전에 학습한 내용을 섞는 문제가 늘어나고 있는데요(이번 주는 아예 첫 문제부터 For반복문을 활용해야 했죠), 다음 주에도 짧게 복습을 하고 시작해야겠습니다.

728x90

댓글