본문 바로가기
IT

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

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

이번 주는 Learn to Code 1에서 Logical Operators(논리 연산자)를 배워볼 겁니다.
지난 시간에 배운 조건문 If를 더 효과적으로 만들기 위해서 필요한 게 바로 논리연산자입니다.
논리연산자에는 !(NOT), &&(AND), ||(OR), 이 있는데요, 각각의 쓰임은 문제를 풀면서 하나씩 알아가 보죠.


1. Using the NOT Operaor
목표 : NOT 연산자를 사용하여 캐릭터가 가는 길에 Gem이 없도록 하라
즉, NOT 연산자를 써서 랜덤으로 생성되는 4개의 Gem을 모두 모아라
풀이 : 

랜덤맵과 미리 입력된 코드

미리 입력된 반복문을 보면 Byte는 4번 moveForward() 합니다.
그리고 맵은 랜덤인데, 4칸 중 3칸만 Gem이 있고, Gem이 없는 칸은 계단으로 내려가야 Gem을 얻을 수 있죠.
그럼 어떻게 말해야 Byte가 알아들을까요?
'Gem이 있으면 Gem을 줍고, 없으면 계단 밑의 Gem을 줍고 다시 원래 길로 돌아와'라고 하면 될 것 같습니다.
잼이 있으면은 지난 시간에 배웠듯이 if isOnGem을 쓰면 되고, 
잼이 없으면은 'Not'isOnGem, 그래서 !isOnGem으로 표현하면 될 것 같습니다.
또 다른 조건이니까 else if를 붙여서 else if !isOnGem을 입력하면 되겠죠.
답 : 
for i in 1 ... 4 {
moveForward()
if isOnGem {
collectGem()
else if !isOnGem {
turnLeft()
moveForward()
moveForward()
collectGem()
turnLeft()
turnLeft()
moveForward()
moveForward()
turnLeft()
}
}

2. Spiral of Not
목표 : NOT 연산자를 사용하여 길이 막혔을 때 왼쪽으로 돌도록 만들어라
(그리고 최종점의 스위치를 켜라)
풀이 : 

13칸이 주어지는 랜덤맵입니다.
길이 안 막혔을 때는 계속 앞으로 가고, 길이 막혔으면 turnLeft()하게 만들면 되겠네요.
답 : 
for i in 1 ... 13 {
if isBlocked {
turnLeft()
moveForward()
else if !isBlocked {
moveForward()
}
}
toggleSwitch()

 

3. Checking This AND That
목표 : AND 연산자를 사용하여 두 가지 조건을 결합하고, 모두 참(True) 일 때 움직이도록 조정하라
풀이 : 

이번에는 랜덤맵이 아니네요.
6개의 Gem을 줍고, 이미 켜져 있는 1개의 스위치를 제외한 나머지 3개의 스위치를 켜면 됩니다.
7번 moveForward()하도록 조건문이 미리 설정된 상태고요.
Gem을 줍는 건 그냥 주우면 될 것 같고, 3개의 스위치가 놓인 곳의 공통점을 찾아 조건으로 달면 되겠군요.
뭐가 있을까요?
일단 왼쪽에 높이 솟은 블록이 있습니다(그건 이미 켜진 스위치 줄도 마찬가지죠)
또 하나는 Gem이 놓여있습니다.
그럼 위 두 가지 조건을 넣어서 조건문을 만들면 되겠네요. 
답 : 
for i in 1 ... 7 {
moveForward
if isOnGem && isBlockedLeft {
collectGem()
turnRight()
moveForward()
moveForward()
toggleSwitch()
turnLeft()
turnLeft()
moveForward()
moveForward()
turnRight()
else if isOnGem {
collectGem()
}
}

4. Checking This OR That
목표 : OR 연산자를 사용하여 둘 중 하나의 조건이 참(True)이면 움직이도록 조정하라
풀이 : 

이번에도 또다시 고정맵입니다.
순간이동을 통해 Gem을 얻으면 되겠습니다.
12번 움직이도록 반복문이 미리 설정되어 있군요.
시작섬(주황)에서 4번, 순간이동한 섬(하늘)에서 Gem까지 8번 움직이면 됩니다.
돌아야 하는 지점의 왼쪽과 앞이 막혀있다는 공통점이 있으므로 '앞이나 왼쪽이 막혀있으면 회전한다'는 조건을 달면 되겠네요.
답 : 
for i in 1 ... 12 {
if isBlocked || isBlockedLeft {
turnRight()
moveForward()
else {
moveForward()
}
}
collectGem()

5. Logical Labyinth
목표 : 논리연산자와 조건문을 활용하여 Gem을 다 얻고, 스위치를 다 켜기
풀이 : 

고정맵에서 Gem 7개와 이미 켜져 있는 1개의 스위치를 제외한 5개의 스위치를 켜면 되는 문제입니다.
미리 입력된 값이 8번 moveForward()하는 것에서 힌트를 얻어 코드를 작성해보면 되겠네요.
1) 옆으로 새서 Gem을 가져와야 하는 경우는 꺼진 스위치가 있고, 그 위에 Gem이 있는 경우입니다(AND)
2) 스위치만 꺼져있는 경우는 막다른 길이라서 스위치를 켜고 왼쪽으로 돌아주어야겠네요.
3) 나머지는 Gem만 있는 경운데, 별다른 특징이 없으니까 그냥 잡기만 하면 됩니다.
답 : 
for i in 1 ... 8 {
moveForward()
if isOnClosedSwitch && isOnGem {
toggleSwitch()
collectGem()
turnRight()
moveForward()
moveForward()
collectGem()
turnLeft()
turnLeft()
moveForward()
moveForward()
turnRight()
else if isOnClosedSwitch {
toggleSwitch()
turnLeft()
else if isOnGem {
collectGem()
}
}

마치며
오늘 배운 내용은 이렇게 요약할 수 있습니다.
NOT 연산자(!)는 '이게 아니면, 이걸 해'
AND 연산자(&&)는 '두 가지 조건 모두 충족되면 실행해'
OR 연산자(||)는 '둘 중 하나만 충족되더라도 실행해'
논리연산자는 조건문에 부가되는 개념이라서 그런지 이전 시간보다는 좀 덜 어려웠네요.
다음 시간에는 For 반복문 외의 또 다른 반복문을 배워볼 겁니다. 문제수가 9개로 가장 많아서 조금 난이도가 있을 것으로 예상이 됩니다. 그래도 해보면 별 거 아니겠죠.
그럼 한 주 뒤에 만나요. 안녕!

728x90

댓글