알고리즘/해결

LeetCode728. Self Dividing Numbers

언클린 2020. 3. 25. 20:52
728x90

1. 문제(원본)

A self-dividing number is a number that is divisible by every digit it contains.

For example, 128 is a self-dividing number because 128 % 1 == 0, 128 % 2 == 0, and 128 % 8 == 0.

Also, a self-dividing number is not allowed to contain the digit zero.

Given a lower and upper number bound, output a list of every possible self dividing number, including the bounds if possible.

Example 1:

Input: left = 1, right = 22 Output: [1, 2, 3, 4, 5, 6, 7, 8, 9, 11, 12, 15, 22]

Note:

  • The boundaries of each input argument are 1 <= left <= right <= 10000.

2. 문제

임의의 수 범위를 입력하여 자신의 각 단위로 나누어 지는 수들의 배열을 구하라

예) 128 이라면 1로도 나누어 지고 2로도 나누어 지고 8로도 나누어 진다. 

3. 나의 답

class Solution {

    func selfDividingNumbers(_ left: Int, _ right: Int) -> [Int] {

        var result: [Int] = []

        for element in left...right where !String(element).contains("0") {

            var input = false

            for char in String(element) {

                input = (element % Int(String(char))! == 0) ? true : false

                if !input { break }

            }

            if input { result.append(element) }

        }

        return result

    }

}

4. 다른 유저의 답

#1

class Solution {

    func selfDividingNumbers(_ left: Int, _ right: Int) -> [Int] {

        var result = [Int]()

 

       outerLoop: for i in left...right {

            for c in String(i) {

                if  c == "0"  || i % Int(String(c))! != 0 {

                    continue outerLoop

                }

            }

            result.append(i)

        }

 

        return result

    }

}

 

#2

func selfDividingNumbers(_ left: Int, _ right: Int) -> [Int] {

    var output = [Int]()

    for i in left...right {

        if isSelfDividing(i) { output.append(i) }

    }

    return output

}

 

func isSelfDividing(_ num: Int) -> Bool {

    var value = num

    while value > 0 {

        let digit = value % 10

        if digit > 0, num % digit == 0 {

            value /= 10

        } else {

            return false

        }

    }

    return true

}

5. 마무리

이번 문제는 문제 그대로 풀려고 하지 않고 조금 다르게 접근을 해보았다. 수의 범위가 10000까지이고 반복문을 쓰지 않을 수는 없으니 최대한 반복문의 부담을 덜기 위해 0을 포함하고 있는 수는 애초에 배제하였다. 

후의 각 자릿 수 별로 나눌 때도 한가지라도 나누어지지 않으면 그대로 그 수의 처리는 끝내고 다음 수를 처리할 수 있도록 하였다.

덕분에 효과적으로 10000까지의 수도 빠르게 처리가 되었다.

728x90