(Swift) 백준 1065 한수

SteadySlower·2022년 5월 11일
0

Coding Test

목록 보기
21/298

1065번: 한수

func isHan(n: Int) -> Bool {
    let array = String(n).map { Int(String($0))! }
    if array.count == 1 { return true }
    let diff = array[1] - array[0]
    for i in 1..<(array.count - 1) {
        if diff != array[i + 1] - array[i] {
            return false
        }
    }
    return true
}

let N = Int(readLine()!)!
var result = 0

(1...N).forEach { n in
    if isHan(n: n) {
        result += 1
    }
}

print(result)
  1. 한수의 정의에 맞추어서 판독하는 함수를 구현합니다.
    1. 등차수열 여부를 가리기 위해서는 자릿수로 접근해야 하므로 정수를 Array로 바꾸어 줍니다.
    2. 1자리수는 무조건 한수이므로 true를 리턴한다.
    3. 반복문을 통해 각 자릿수가 등차수열을 이루는지 확인한다.
  2. 1 ~ N까지 반복문을 통해 한수의 갯수를 확인한다.

🤔  정수의 자릿수에 접근하는 2가지 방법 중에 뭐가 좋을까?

  1. 10의 배수로 나누는 방법
  2. 배열로 바꾸는 방법

개인적으로 파이썬으로 문제를 풀던 버릇이 남아있어서 배열로 접근하는 것을 더 선호합니다. n번째 자릿수라는 측면에서 index를 사용하면 더 직관적이기도 하고요. 하지만 속도 면에서는 의문이 드는 것이 사실입니다.

하지만 10의 배수로 나누는 방법은 O(1)이고 배열의 index로 접근하는 것도 O(1)입니다. 정수를 배열로 바꾸는 연산은 1번만 하면 되므로 O(상수)에 해당하므로 무시되죠. 그렇게 생각했을 때 시간복잡도면에서는 큰 차이가 나지 않기 때문에 아무거나 사용해도 된다는게 제 결론입니다. (실제로 이 문제를 2가지 풀이로 넣어봤는데 속도, 메모리가 동일했습니다.)

profile
백과사전 보다 항해일지(혹은 표류일지)를 지향합니다.

0개의 댓글