[Swift/프로그래머스] 짝수의 합 / Stride 를 알게 되다.

sonny·2024년 11월 11일
9

TIL

목록 보기
38/48

이 문제는 저번주 수요일엔가 풀었던 문제인데,

풀 때 새로운 전역함수를 알게되어 급하게 임시글에 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:to:by:)

  • 시작 값에서 목표 값 전까지 일정 간격으로 진행, 종료값을 포함하지 않음.
  • 예: stride(from: 0, to: 10, by: 2) 는 0, 2, 4, 6, 8을 반환한다.

stride(from:through:by:)

  • 시작 값에서 목표 값을 포함하여 일정 간격으로 진행, 종료값을 포함 함.
  • 예: stride(from: 0, through: 10, by: 2) 는 0, 2, 4, 6, 8, 10을 반환한다.

for 문과 stride 함수는 무슨 차이가?

둘 다 반복처리를 할 수 있지만,

범위를 지정하고 순회하는 방식에서 약간의 차이가 있는걸 알 수 있다.

범위의 유연성

  • for 문의 경우 0,,<10 이나 1...5 같이 정수 범위를 직접 사용하면서 범위가 고정된 경우에는 유용하다.
  • stride는 일정 간격으로 가지는 시퀀스를 생성하기에, for 문과 달리 지정한 간격으로 값을 증가시키거나 감소시키는데 더 적합하다.

간격 설정

  • for 문의 경우 기본적으로 간격이 1이다.
  • strideby 매개변수를 통해서 간격을 직접 설정할 수 있다. 2씩도 가능하고 -0.5도 가능하다

시작과 끝 지점에 조건 설정

  • for 문의 경우 범위를 사용하는 방식으로 끝 지점을 포함하는지 포함하지 않는지 (...) 이 렇게만 설정이 가능하다.
  • stridetothrough를 통해서 끝 지점이 포함 되는지 아닌지를 구분해줘서 좀 더 세밀한 설정이 가능하다.

.
.
.

예시로 비교해보자.

// 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 쓰면 그만이다.

// stride를 이용한 감소 반복

for i in stride(from: 10, through: 0, by: -2) {
    print(i)  // 10, 8, 6, 4, 2, 0
}

for문은 기본적으로 감소 순회가 어렵다고 한다.

stride는 간격을 음수로 설정하는 방식으로 간단하게 해결 가능!!

한 줄 요약

  • for 문은 범위 순회에 좋고, stride는 증가 간격을 설정하거나 감소 순회에 더 유용하다.
  • strideby 매개변수를 통해 세밀한 간격 제어가 가능해 일정한 간격의 반복이 필요한 경우 효과적이다.

음 ...

뭔가 기존에 반복문에서 간격 조절을 할 때 조건문과 다양한 연산을 추가하는 방식으로 구현했다면,

이제는 stride를 통해서 더 깔끔하고 직관적으로 코드 작성을 할 수 있다는걸 알게되었다.

특히 반복 조건이 복잡할 때는 정말 가독성도 좋아서 너무 인상 깊었던 함수였다.

오늘 공부하면서 정말 다양한 반복문의 방식이 있는데,

어떤 경우에 stride가 더 적합한지에 대해 조금은 이해한 듯 하다.

앞으로 코드에서 간격조정이 필요한 반복문을 만나면 stride를 우선적으로 생각해보려고 한다.

재밌다! 재밌다! 계속 재미있으면 좋겠다!

profile
iOS 좋아. swift 좋아.

7개의 댓글

comment-user-thumbnail
2024년 11월 11일

맙소사 이런 함수가.. 이름도 찰떡처럼 지어놨네유

1개의 답글

아까 설명해주신 것보다 자세한 설명!!
좋은 메소드 알려주셔서 감사합니다😈

1개의 답글
comment-user-thumbnail
2024년 11월 12일

for-in으로 배열 역방향 순회 하느라 배열을 reversed()로 뒤집어서 순회 했었는데 stride 라는 게 있었네요

1개의 답글