호댕의 iOS 개발

[알고리즘] for 문을 거꾸로 돌 순 없을까? (프로그래머스 문제) 본문

Software Engineering/Swift

[알고리즘] for 문을 거꾸로 돌 순 없을까? (프로그래머스 문제)

호르댕댕댕 2022. 1. 23. 11:47

알고리즘 문제를 풀다가 for 문을 거꾸로 돌아야 하는 상황이 있었다. 

물론 배열에서 for 문을 돈다면 배열에 .reversed()를 하여 for 문을 돌리면 됐지만 문제는 단순히 특정 범위를 돌아야 할 때였다. 

 

나는 1부터 for문을 돌리고 싶은 것이 아니라.. 마지막 숫자부터 1까지를 돌리고 싶었다...

내가 마주한 문제는 다음과 같다. 

 

초등학교 때(?) 배웠던 최대공약수와 최소공배수를 구하는 문제였는데 구하는 것은 간단했지만 막상 코드로 분기를 하려니... 마냥 쉽지만은 않았다. 이때 만약 m이 n으로 나뉘지 않는다면 n부터 1까지 내려가면서 나눠지는 값이 있는지 찾아야 했다. 

 

이때 1부터 올라가면서 하게 된다면 공약수를 찾을 순 있지만 최대 공약수는 찾을 수 없는 문제가 있었다. 

그렇다면 이때 사용할 수 있는 것은 뭘까?

 

이때 사용할 수 있는 것이 바로 stride(from:to:by)이다. 

 

그럼 stride 메서드를 어떻게 사용하는지 살펴보자. 

 

  • start: 연속되는 값이 시작되는 값을 의미한다. 
  • end: 연속되는 값이 끝나는 값을 의미한다. 이는 포함되진 않는다. 
  • stride: 연속되는 값들이 각각 얼마나 떨어져있는지를 작성하게 된다. 만약 양수로 적으면 점점 커지면서 반복되고, 음수로 적으면 점점 작아지면서 반복된다. 

이를 사용하게 되면 큰 수부터 작은 수까지 내려오는 sequence를 구성할 수 있었다. 

 

따라서 이를 바탕으로 작성한 코드는 다음과 같다. 

 

func solution(_ n:Int, _ m:Int) -> [Int] {
    var result = [Int]()
    if m % n == 0 {
        result.append(n)
        result.append(m)
    } else {
        for divider in stride(from: n - 1, to: 0, by: -1) {
            if m % divider == 0, n % divider == 0 {
                result.append(divider)
                result.append(m * n / divider)
                break
            } 
        }
    }
    
    return result
}

 

알고리즘 문제를 풀면서 평소 프로젝트를 할 때는 거의 사용하지 않았던 메서드들도 알아가는 것 같다. 

Comments