본문 바로가기
Coding/Swift

Playgrounds 코딩 배우기 2 > 유형 > 세상의 가장자리

Swift Playgrounds 코딩 배우기 2 > 유형 > 세상의 가장자리

 

문제를 해결하는데 은근히 많은 시간이 소요되었고, 작성한 코드도 그닥 마음에 들지 않는 문제였다. 

 

 

제시된 조건_

여러 해결 방법을 시도하여 가장 효과적인 방법을 찾아 보세요.

효과적인 코드를 작성하면 프로그램이 더 빠르게 실행되고 사람들의 앱 사용 만족도가 높아질 뿐 아니라 배터리 사용 시간도 개선됩니다. 

 

 

크게 4구역으로 나누어 모든 구역을 한 번씩만 방문하는 것을 목표로 하였다.

내가 생각하는 높은 효율은 한 번 방문한 곳은 다시 방문하지 않도록 하는 것이었기 때문이다. 

 

+

어려움을 겪었던 부분은 2번 구역에서 3번 구역으로 넘어가는 구간이다.

2번 구역의 보석을 모두 수집하고 다시 오렌지 포탈을 열어 1번에서 3번으로 가는 방법도 생각해봤는데,

1->3이든 2->3 이든 전체 흐름에서 코드를 수정해야한다는 사실은 같았기 때문에

이동거리가 더 짧은 2->3을 선택하게 되었다. 

 

게다가 1->3으로 가게되면 진행방향에 따라서 오른쪽 방향으로 향하였을 때

보석이 없기 때문에 다른 보석을 수집할 수 없게된다. 

 

+

2->3으로 넘어가는 부분은 다소 부자연스러운 코드를 쓰게 되었다.

임의로 개입하여 이동 방향을 바꾸어야 했기 때문이다. 

이러한 개입은 진행 중에 딱 한 번 필요했기 때문에 비효율적이지만 oneTimeSwitch 라는 변수를 선언하였다.

oneTimeSwitch 라는 변수에 0이라는 값을 주고 한 번 실행되면 1의 값을 같도록 하여 반복실행을 피했다. 

 

+

조건문에 gemCounter와 SwitchCounter로 제약을 주렁주렁 달아놓은 것은

이 상황에서만 해당되는 것이기 때문에 범용성이 떨어지는 코드라고 생각한다.

 

내 코드_

orangePortal.isActive = false
greenPortal.isActive = false
var switchCounter = 0
var gemCounter = 0
var oneTimeSwitch = 0

turnRight()
moveForward()
while switchCounter < 6 || gemCounter < 6{
    if !isBlockedRight {
        turnRight()
    }
    
    if isOnClosedSwitch {
        switchCounter += 1
        toggleSwitch()
        turnLeft()
        turnLeft()
    } else if isOnGem {
        gemCounter += 1
        collectGem()
        turnLeft()
        turnLeft()
    }
    
    if switchCounter == 2 && gemCounter == 0{
        orangePortal.isActive = true
    } else {
        orangePortal.isActive = false
    }
    
    if gemCounter == 6 && switchCounter == 2 {
        greenPortal.isActive = true
    } else {
        greenPortal.isActive = false
    }
    
    if gemCounter == 4 && oneTimeSwitch == 0 {
        moveForward()
        turnLeft()
        oneTimeSwitch = 1
    }
    moveForward()
}

 

 

사담_

이번 코드는 상당히 자신없는 코드입니다.

문제가 정말로 안풀릴때 참고만 해주세요.

저도 .... 더 좋은 코드를 생각해보겠습니다 !