오늘 푼 문제
https://school.programmers.co.kr/learn/courses/30/lessons/12954
프로그래머스
코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.
programmers.co.kr
내 코드
1차 풀이
func solution(_ x:Int, _ n:Int) -> [Int64] {
var answer: Array<Int64> = []
var num = Int64(x)
for _ in 0...n - 1 {
answer.append(num)
num += Int64(x)
}
return answer
}
문제를 보고, answer 를 반환하기 위해서 명시적으로 for 반복문을 사용하였다. 그러나, 해당 방법은 코드가 길고 배열과 append 를 사용할 경우 메모리가 확장될 때 마다 추가적인 비용이 발생할 수 있다.
이 문제를 조금 더 간단하게 풀 수 있는 방법이 있다.
이 문제의 솔루션은 '배수'이기에, map 메서드와 클로저를 사용하여 구현하는 것이다.
아래 코드를 보자.
2차 풀이
func solution(_ x:Int, _ n:Int) -> [Int64] {
// x를 Int64로 캐스팅하고, x만큼 증가하는 숫자를 n개 포함하는 배열 생성
let x64 = Int64(x)
return (1...n).map { Int64($0) * x64 }
}
일단 x64 라는 상수를 먼저 선언하는 것이 좋다. map 함수를 호출하기 전에 단 한 번만 Int64(x)를 이전에 호출하기 때문이다.
'(1...n)' 의 범위 내 각 숫자에 대해 { Int64($0) * x64 } 클로저를 적용하여, 'x'의 배수를 계산하는 것이다.
반환하는 값은, x부터 시작하여 x씩 증가하는 n개의 숫자를 포함하는 배열이다.
느낀점
나는 아직 클로저와 map 과 같은 여러가지 메서드를 사용하는 것이 익숙치 않다. 이것에 익숙해져야 Swift 다운 코드로 문제를 풀 수 있다는 것을 깨달았다.
또한 해당 문제의 리턴 값 타입이 단순히 Int 가 아니라 Int64 였는데, 이것을 평소에 그냥 지나쳤던 부분이라고 생각한다.
Int64 처럼 정수형 타입에 대해서도 추가적으로 되새길 수 있는 시간이었다.
Int, Int64 는 가장 많이 사용되는 정수 타입이다. 각 타입의 특성을 이해하는 것은 데이터의 크기와 연산의 정확성을 고려할 때 중요하기에 제대로 알 필요가 있다!
Int
Int 타입을 쓴다면, 이것은 플랫폼에 따라 크기가 달라질 수 있는 정수 타입이다.
32비트 시스템에서는 'Int32' 를, 64비트 시스템에서는 'Int64'와 동일하다.
그렇다면, Int64, Int32, Int16, Int8 은 각각 64비트, 32비트, 16비트, 8비트 정수를 표현하도록 명시하는 것!
그 외, Swift 에서는 부호 없는 정수 타입(Uint, UInt64, ..., UInt8) 를 제공한다.
이 타입들은 모두 부호가 없으므로, 같은 비트 수에서 양수 범위를 제공하지만, 음수는 표현할 수 없다.
이들은 음수 값을 필요로 하지 않는 경우에 적합하나, 굳이 UInt 를 고집할 필요는 없다.
만약 코드 안에 Int와 UInt 를 같이 사용한다면 정수 타입의 변수끼리도 값을 교환할 때 많은 자원을 소모할 수 있기 때문이다!