백준 1110번 Swift 알고리즘 연습
대학생활하며 수학 문제 좀 풀어봐서 간단한 알고리즘 구상은 쉬울거 같았는데...
이번 문제는 문법적인 측면보단 알고리즘 형태를 고민하는데 많은 시간을 보냈다...!!
* 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)
- for, repeat-while, if 모두 익숙해질때까지 많이 사용해봐야, 어느 시점에서 for를 쓸지 while을 쓸지 등에 대한 감이 올 것 같다.
- 지금까진 변수명에 신경을 안쓰고 있었는데. 점점 변수가 많아질수록 변수명 선언이 중요해진다!