본문 바로가기
Algorithm/문제풀이_백준

Swift) 백준 4375번 (1)(종료조건 EOF)

by Joahnee 2021. 8. 24.

요구능력 : EOF를 쓸줄아느냐, 기본적인 수학

 

코드설명 : 

 

1. 문제에서 별도의 종료조건이 없기 때문에 EOF를 사용한다.

이 때, 스위프트에서는 별도의 EOF가 없기 때문에 while문에서 코드와 같이 받아주면된다.

commandLineTool에서도 입력받을 때 ctrl + d를 입력해주면 EOF를 쓸수있다.

 

2. next에는 1, 11, 111등이 들어갈 것인데, 이게 나누어 떨어지면 n의 배수이다.

 

3. next를 1, 11, 111, ... 를 만드려고 (next * 10) + 1 을 해준다.

 

4. 갑자기 next %= Int(n)! 을 왜?

사실, 안해도 답은 나온다.

나도 여기서 많이 헤맸는데, 알아보니 더 큰 수로 넘어가면 Int의 범위를 초과하기 때문에 컴파일에러가 나타나는 것이었다.

범위초과를 막기위해 줄이는 방법인데,

 

자, n= 3인 경우를 생각해보자.

안쪽의 while문 도는걸 디버깅해보면

count가 1이 됬을 때, else문으로 갈것이고 next는 11이된다.

그리고 아래에서 3의 나머지인 2가 next에 들어간다.

그리고 또 돌면 count = 2 , next % n은 2가된다.

next = 21 이 되고, next %= n으로 인해 next는 0이된다.

그럼결국 count가 3이되고 count를 프린트하고 빠져나온다. 

 

3으로 한번에 나눠서 나머지를 구하는거나

여러번 나눠서 나머지를 구하는거나

최종적으로 나누어 떨어지는데 까지가면

결국, 나누는 횟수는 똑같아진다.

 

후기 : 문제풀이를 어렵게 했다.

swift에서 EOF를 몰랐을 뿐더러, 1로만 이루어진 n의 배수가 뭔소린가 싶었다.

ex) 1, 11, 111등의 숫자 라고 써줫으면 훨씬 편했을것을..

 

나머지를 구할때 수가 커질것 같으면 나머지연산을 여러번 사용해주자!

while let n = readLine() { //1번

    var count = 0 //자릿수를 세기위한 변수
    var next = 1 //1, 11, 111, ... 을 하기위한 변수이다.
    
    while true {
        count += 1
        if next % Int(n)! == 0 { //2번
            print("\(count)")
            break
        }else {
            next = ((next * 10) + 1)
            next %= Int(n)!
        }
        
    }
}

댓글