📌 Swift

[오늘의 Swift 지식] stride 함수 (백준 2742번 기찍 N, 역수 구하기)

백준의 2741번째 문제를 풀고 기찍N 이라는 2742번을 풀다가
오류가 계속 나서 찾아보다가 stride라는 함수를 찾게 되었습니다.

그냥 공부만 하기에는 잊어버릴 것 같고 꾸준히 참고할 거 같아서 정리하였습니다.

 

stride( ) 함수

스크린샷 2021-10-11 오전 4 09 35

 

먼저 stride가 무슨 뜻인지 궁금해서 검색을 해보았다. 보폭이라는 뜻으로 나오고 인터넷에서 찾다 보니 보폭만큼 다가간다는 것 같다.

 

그러면 from부터 to까지 by의 매개변수 값만큼 이동한다는 걸로 알면 될 거 같다.

 

 2742번 기찍 N문제와 동일하게 5를 입력받았을 경우에, 5부터 1까지 역순으로 출력하는 코드를 작성한다면,

import Foundation

let number = Int(readLine()!)!

for i in stride(from: number, to: 0, by: -1) {
    print(i)
}

위의 코드와 같이 작성할 수 있을 것이다.

 

readLine()을 사용하므로 import Foundation이 필수이고 stride 함수를 사용하여, "입력받은 number부터 시작해서 0의 바로 앞인 1까지 -1씩 다가간다"는 뜻이다. 그래서 5부터 시작해서 0의 앞인 1까지 -1씩 가기 때문에, '5, 4, 3, 2, 1'이 출력되게 되는 것이다.

 

여기서 "5부터 1까지 역순으로 나오는 건데 왜 to에 1이 아닌, 0을 적어야 하지? 1까지니까  to: 1로 해야 하지 않나?" 라며 헷갈릴 수 있을 것 같은데, 그 이유로는 위에 공식문서를 보면 알 수 있다.

 

위에 있는 공식문서의 Return Value부분을 보면, "from의 값은 포함하지만 to의 값은 포함하지 않는다"라고 작성되어있다.

 

그래서 5부터 포함되지 않는 0까지로 작성해주어서 5부터 1까지 출력되도록 하는 것이다.

 

 

to 대신, through?

스크린샷 2021-10-11 오전 3 39 57

 

코드를 작성해보니, 궁금한 것이 생겼다. stride 함수에서 to 대신에 through를 사용하는 방법이 하나 더 있었다.

 

그럼 through는 뭐가 다른가 하고 to 대신 through를 작성해 보았는데,

스크린샷 2021-10-11 오전 3 44 26

 

사진에서 보이듯이, 1이 아닌 0까지 출력되었다. to는 그 파라미터 값까지 포함하지 않는 것 같은데, through는 포함하는듯하다.

 

그래도 확신이 필요하여 공식문서를 확인해보았다.

스크린샷 2021-10-11 오전 4 09 25

 

여기서도 위에 작성한 것과 동일하지만, 여기서도 Return Value를 보게 되면 'end'도 포함한다.

 

즉, 위에 작성되어있는 through의 파라미터 값은 포함한다는 뜻이다.

 

그러면 to 대신 through를 사용해서 위와 같이 5부터 역순으로 1까지 출력하려면, through: 0이 아닌, through: 1로 작성하면 5부터 1까지 제대로 출력이 된다.

 

 

Plus!!

여기서는 역순으로 하는 것이 목표였기 때문에, by: -1을 해주었는데, by의 파라미터 값은 당연히 양수로도 가능하다.

import Foundation

let number = Int(readLine()!)!

for i in stride(from: number, through: 7, by: 2) {
    print(i)
}

 

라는 코드를 작성해 주었을 경우,

스크린샷 2021-10-11 오전 4 25 10

 

위의 사진과 같이 1, 3, 5, 7이 출력된다.

 

이유는 알겠지만, number(1)부터 7까지 2 보폭만큼 다가간다는 코드이므로, 1부터 2씩 커지며 7까지인 1, 3, 5, 7가 출력되는 것이다.

 

through를 7로 작성해주어서 7이 포함되었지만, 만약 through대신 to: 7로 작성했다면 어떻게 될까??

 

당연하게도 to: 7로 작성하면 그 파라미터 값까지 포함하지 않으므로, 1부터 6까지로 되어서 1, 3, 5만 출력될 것이다.

 

결론으로는, to와 through는 "입력한 파라미터 값까지 포함을 하냐, 포함을 하지 않냐"의 차이인 것 같으니, 헷갈리지 않게 편한 것을 골라서 사용하면 될 것 같다.

 

 

 

공부한 내용을 바탕으로 정리하다 보니, 오타나 틀린 내용이 있을 수 있습니다.
틀린 내용이나 오타는 댓글로 알려주시면 감사하겠습니다 :)