TIL/알고리즘 공부

백준 1110번 Swift 알고리즘 연습

여의도사노비 2022. 3. 30. 17:07
728x90

대학생활하며 수학 문제 좀 풀어봐서 간단한 알고리즘 구상은 쉬울거 같았는데...

이번 문제는 문법적인 측면보단 알고리즘 형태를 고민하는데 많은 시간을 보냈다...!!

 

* 1110번

 

1)

var a = Int(readLine()!)!

var e: Int

e = a

 

for i in 1... {

    

    var x: Int

    var b: Int

    var c: Int

    

    x = i    

    b = e / 10

    c = e % 10

    e = c * 10 + ((b+c) % 10)

    

    if e == a {

        print(x)

        

        break

    }

}

  • for문을 값이 나올때까지 돌리면 되겠다는 알고리즘은 금방 생각이 났다.
  • 그러나 처음 첫 번째 자리수와 두 번째 자리수를 나누는 과정에 너무 많은 기준을 생성하여 기하급수적으로 코드가 늘어났고 그렇게 늘어나다 보니 for문을 사용하는 이유를 잊을 만큼 반복적인 코드가 많이 늘어나버렸다.
  • 또한 e를 정의할때 e의 값을 매번 새롭게 갱신하여 if문에 해당하는 값이 나오는지를 확인했어야하는데 e를 for문 안에 넣어 정의를 넣어서 for문이 돌아갈때 계속 e = a 가 반복적으로 재정의 되었다.
  • 위의 두 문제가 돌아보면 너무나도 간단한 문제였건만... 항상 돌아보기 전까진 간단한 문제라는 생각을 쉽사리 하지 못한다..!
  • 그래도 결국 해결!

 

2) 변수가 점점 늘어나 이제 슬슬 변수 네이밍에도 신경을 써줌

var input = Int(readLine()!)!

var newValue: Int

 

newValue = input

 

for i in 1... {

    

    var cycle: Int

    var firstNumber: Int

    var secondNumber: Int

    

    cycle = i

    

    firstNumber = newValue / 10

    secondNumber = newValue % 10

    

    newValue = secondNumber * 10 + ((firstNumber + secondNumber) % 10)

    

    if newValue == input {

        print(cycle)

        

        break

    }

  

}

 

3) repeat while문 예시

let input = Int(readLine()!)!

 

var cycle = 0

var inputNew = input

 

repeat {

    let firstNumber = inputNew / 10

    let secondNumber = inputNew % 10

    let sum = firstNumber + secondNumber

    

    inputNew = secondNumber * 10 + sum % 10

    cycle += 1

} while (input != inputNew)

 

print(cycle)

  • repeat-while문으로 작성한 예시를 찾아 재작성해보았다.
  • 내가 생각해낸 방식 말고 다른 방식들 보면 왜 이렇게 간단해 보이는지.. ㅎㅎ
  • 알고리즘 고수의 길은 험난하다...

 

 

정리(Today I Learned)

  1. for, repeat-while, if 모두 익숙해질때까지 많이 사용해봐야, 어느 시점에서 for를 쓸지 while을 쓸지 등에 대한 감이 올 것 같다.
  2. 지금까진 변수명에 신경을 안쓰고 있었는데. 점점 변수가 많아질수록 변수명 선언이 중요해진다!