Updated:


시작하며

[백준 단계별 문제풀기 - while문] 단계의 문제들 중, 더하기 사이클 문제가 가장 껄끄러운 문제였다. 어떤점이 어려웠고 문제를 풀면서 놓치지 말아야 할지 알아보고 repeat-while문과 while문의 차이점 또한 알아보자.


백준 1110번

백준 1110번 - 1

백준 1110번 - 2

이번 문제의 중요 포인트는, 연산과 반복이다. input값인 XY라는 두자리 또는 한자리 숫자(X=0)에서 XY를 더해 새로운 Z를 만들고, 기존의 Y와 결합해 YZ라는 새로운 숫자를 만든다. 다음을 한 사이클이라 하고, 처음 input값(XY)과 N번의 사이클 후에 생성된 새로운 값(newNumber)이 같을 경우, 반복을 중지하고 N을 출력하면 된다.


var input = Int(readLine()!)!
var newNumber = 0         // 새로운 값을 저장하기 위한 Int형 변수
let comparison = input    // 첫 입력값을 저장하기 위한 변수
var N = 0                 // 사이클 횟수

while comparison != newNumber {
    newNumber = ((input/10)+(input%10))%10+(input%10)*10
    input = newNumber
    N += 1
}
// input이 0일 경우, N = 0으로 출력되는걸 방지
if input == 0 {
    print(1)
}
else {
    print(N)
}

#=>	if input 26, prints 4
#=>	if input 0, prints 1

while문의 조건을 comparison값과 newNumber값이 일치하지 않는 조건에서 사이클이 진행된다. comparison값과 newNumber값이 같을 경우, while문이 종료되고 사이클 N이 출력된다.
단, input값이 0일 경우, newNumber의 초기값과 같이 때문에 while문이 실행되지 않고 바로 종료된다. 따라서 if문을 통해서 input값이 0인 경우를 방지해주었다.

(1) while문

  • comparison값과 newNumber값이 동일하지 않으면 while문 실행
  • 더하기 사이클 연산에 의해 새로운 newNumber값 할당
  • 다음 사이클 계산을 위해, 변수 input값에 newNumber값 저장
  • 사이클 종료, N값에 1 더해짐.

(2) if문

  • input값이 0일 경우, 1이 출력되도록 함
  • input값이 0이 아닐 경우, 사이클 횟수 N값 출력

다음과 같은 방법으로 코드를 작성했지만 불필요하게 if문을 작성하게 되었다.

if문을 사용하지 않기 위해서는 while문에 조건과 같이 comparison(=0)값과 처음 newNumber값이 같이 않아야 하는데, newNumber값이 0으로 설정되어 있으므로 변수선언 과정에서 newNumber값을 음수로 설정해주면 해결된다. 입력값의 범위는 0~99까지 이므로 newNumber값이 음수값을 가지면 처음 while문의 조건을 무조건 만족하게 된다

하지만, 개인적으로 변수 newNumber의 초기값을 변경해줘서 while문의 조건을 우회하는 방법보다 0으로 초기값을 설정하고 무조건 while문의 연산을 한번 실행하게 만들어주고 싶었다.
따라서 조건에 상관없이 일단 코드를 한번 실행하고, 이후에 기존 while문처럼 수행할 수 있는 repeat-while문을 사용하여 코드를 다시 작성해 보았다.


var input = Int(readLine()!)!
var newNumber = 0
let comparison = input
var N = 0

repeat {
    newNumber = ((input/10)+(input%10))%10+(input%10)*10
    input = newNumber
    N += 1
} while comparison != newNumber
print(N)

#=>	if input 26, prints 4
#=>	if input 0, prints 1

repeat-while문을 사용해 newNumber 초기값에 상관 없이, 더하기 연산을 통해 새로운 newNumber값을 저장하고, 이후에 comparison값과 동일한지 확인 후, 반복문을 진행하거나 종료한다.
다음과 같이 repeat-while문은 조건에 상관 없이 repeat {}내에 코드를 먼저 실행하고, 이후에 조건을 확인하게 사용하여 반복문의 순서를 원하는대로 수정하여 사용할 수 있다.





마무리

이번 문제는 연산 구현은 쉬웠지만 사이클의 수를 원하는 정도로 표한히는것이 어려웠다. 사이클마다 연산에 필요한 input값을 일정하게 해놔서 whilea문이 무한반복을 하거나, 위에서 말했듯이 초기 input값이 0일때를 고려하지 못해 오답이 나온 경우가 많았다.
이번 문제를 통해 입력범위에 대한 계산과 while문과 유사한 repeat-while문을 배웠으므로 이후에 문제를 푸는데 유용할 것이라 생각된다.