이 문제는 저번주 수요일엔가 풀었던 문제인데,
풀 때 새로운 전역함수를 알게되어 급하게 임시글에 Stride
만 적어놓고는
언젠가 블로그에 작성해야지.. 했던 걸 지금 쓰게 됐다.
나의 답)
import Foundation
func solution(_ n:Int) -> Int {
return stride(from: 0, through: n, by: 2).reduce(0, +)
}
.
.
문제를 보면 뭔가를 규칙적으로 더하거나 규칙적인걸 바란다? 하면 바로 반복문이 떠오르게 된다.
이걸 풀 때도 그랬었다.
반복적인데? 이거.. 반복문으로 하면되겠거니 하면서 구글에 반복함수의 대해 찾아보았다.
그러다 발견한 도돌이의 세미프로그래밍 이라는 분의 블로그를 보게 되었는데,
swift
의 반복문들을 잘 정리해주셨다.
그 중에서 stride
를 봤는데, 이게 너무 재미있는 함수여서 바로 이용해보려고 했다.
그 전에 stride 공식문서는 필수 !!!!!!!
찾을 땐 제어흐름 쪽으로 들어가면 나온다.
굉장히 짧게 나오기 때문에 눈 크게뜨고 잘 봐야한다.
눈 크게 떠도 못 찾을까봐 캡쳐했다.
두가지 종류가 있었는데 딱 봐도 내가 필요한 건
stride(from: through: by: )
이다.
stride
는 전역함수인데, 이 함수는 반복적인 숫자 범위를 쉽게 생성해주고,
일정 간격으로 값을 증가시켜주거나 감소시키면서 순회할 수 있게 도와준다.
공식문서에서 본 것처럼 stride
는 두 가지 형태로 되어있는데
stride(from: 0, to: 10, by: 2)
는 0, 2, 4, 6, 8을 반환한다.stride(from: 0, through: 10, by: 2)
는 0, 2, 4, 6, 8, 10을 반환한다.둘 다 반복처리를 할 수 있지만,
범위를 지정하고 순회하는 방식에서 약간의 차이가 있는걸 알 수 있다.
범위의 유연성
for
문의 경우0,,<10
이나1...5
같이 정수 범위를 직접 사용하면서 범위가 고정된 경우에는 유용하다.stride
는 일정 간격으로 가지는 시퀀스를 생성하기에,for
문과 달리 지정한 간격으로 값을 증가시키거나 감소시키는데 더 적합하다.
간격 설정
for
문의 경우 기본적으로 간격이 1이다.stride
는by
매개변수를 통해서 간격을 직접 설정할 수 있다.2
씩도 가능하고-0.5
도 가능하다
시작과 끝 지점에 조건 설정
for
문의 경우 범위를 사용하는 방식으로 끝 지점을 포함하는지 포함하지 않는지(...)
이 렇게만 설정이 가능하다.stride
는to
와through
를 통해서 끝 지점이 포함 되는지 아닌지를 구분해줘서 좀 더 세밀한 설정이 가능하다.
.
.
.
예시로 비교해보자.
// for 문으로 구현 (2씩 증가)
for i in 0..<10 where i % 2 == 0 {
print(i) // 0, 2, 4, 6, 8
}
// stride로 구현
for i in stride(from: 0, to: 10, by: 2) {
print(i) // 0, 2, 4, 6, 8
}
보면 for
문은 간격 설정을 위해 별도로 계산을 해야하지만, stride
의 경우 by
매개변수만 설정하면 끝이다.
진짜.. ㅋㅋㅋㅋㅋㅋㅋ 진짜로 너무 간단하다!!!!
// stride를 이용한 감소 반복
for i in stride(from: 10, through: 0, by: -2) {
print(i) // 10, 8, 6, 4, 2, 0
}
for
문은 기본적으로 감소 순회가 어렵다고 한다.
stride
는 간격을 음수로 설정하는 방식으로 간단하게 해결 가능!!
for
문은 범위 순회에 좋고, stride
는 증가 간격을 설정하거나 감소 순회에 더 유용하다.stride
는 by
매개변수를 통해 세밀한 간격 제어가 가능해 일정한 간격의 반복이 필요한 경우 효과적이다.뭔가 기존에 반복문에서 간격 조절을 할 때 조건문과 다양한 연산을 추가하는 방식으로 구현했다면,
이제는 stride
를 통해서 더 깔끔하고 직관적으로 코드 작성을 할 수 있다는걸 알게되었다.
특히 반복 조건이 복잡할 때는 정말 가독성도 좋아서 너무 인상 깊었던 함수였다.
오늘 공부하면서 정말 다양한 반복문의 방식이 있는데,
어떤 경우에 stride
가 더 적합한지에 대해 조금은 이해한 듯 하다.
앞으로 코드에서 간격조정이 필요한 반복문을 만나면 stride
를 우선적으로 생각해보려고 한다.
재밌다! 재밌다! 계속 재미있으면 좋겠다!
맙소사 이런 함수가.. 이름도 찰떡처럼 지어놨네유