문제 설명 자연수 n이 매개변수로 주어집니다. n을 3진법 상에서 앞뒤로 뒤집은 후, 이를 다시 10진법으로 표현한 수를 return 하도록 solution 함수를 완성해주세요.
제한사항 n은 1 이상 100,000,000 이하인 자연수입니다.
입출력 예
🔵 풀이 1
import Foundation
func solution(_ n:Int) -> Int {
// reversed 3진수 구하기
var reversedArr: [Int] = []
var temp = n
while true {
if temp == 0 { break }
reversedArr.append(temp % 3) // 먼저 나온 나머지부터 배열에 담으므로 reversed 3진수.
temp /= 3
}
// 10진수 구하기
let arr = reversedArr.reversed()
var decimalN: Int = 0
for (i, num) in arr.enumerated() {
decimalN += Int(pow(3.0,Double(i))) * num // pow 사용법 https://please-amend.tistory.com/36
print(decimalN)
}
return decimalN
}
새로 알게 된 것
▶️ 10진수 -> n진수 변환법
10진수를 n으로 연쇄적으로 나누어 나온 일련의 나머지들을 구하고, 가장 마지막으로 나온 나머지부터 순차적으로 읽는다.
=> 리턴 타입이 Int가 아니므로, Int인 num과 곱하여 decimalN에 넣을 수 없다.
=> 그런데 Int의 초기화 함수는 Decimal을 받을 수 없다.
그럼 pow의 리턴값을 Decimal이 아닌 타입으로 받을 수 있는 방법이 있을까?
=> x와 y를 Folat이나 Double로 입력하면 된다.
▶️ reverse()와 reversed()의 차이
<공통점>
reverse()와 reversed() 둘 다 콜렉션의 elements를 뒤집는 인스턴스 메소드이다.
<차이점>
reverse()는 원본 자체를 정렬하는 반면,
reversed()는 원본은 그대로 둔 채 뒤집은 콜렉션을 '반환'한다는 차이가 있다.
따라서 둘의 시간복잡도가 reverse()는 O(n), reversed()는 O(1)로 다르다.
reversed()에는 또 다른 특징이 있는데,
원본과 같은 타입의 콜렉션을 반환하고 싶을 때는 해당 타입으로 초기화가 필요하다고 한다.
한편, 여기(링크) 풀이 2에서는 Array로 감싸지 않고도 reversed()가 사용되었는데,
아마 compactMap 함수를 이용해서 그런 것 같다.
🔵 풀이 2
init(_:radix:)를 이용해서 진수를 변환한 풀이가 있었다!!
import Foundation
func solution(_ n:Int) -> Int {
let flipToThree = String(n,radix: 3)
let answer = Int(String(flipToThree.reversed()),radix:3)!
return answer
}
▶️ init(_:radix:) 사용방법
init(_:radix:) 또한 초면이기에... 몇 번 부딪혀 보니 사용 방법을 알 수 있었다.
let x = Int("123")
// x == 123
let y = Int("-123", radix: 8)
// y == -83
let y = Int("+123", radix: 8)
// y == +83
let z = Int("07b", radix: 16)
// z == 123
- 포맷이 잘못되었거나 숫자가 너무 클 때는 nil을 반환한다.
Int(" 100") // Includes whitespace
Int("21-50") // Invalid format
Int("ff6600") // Characters out of bounds
Int("zzzzzzzzzzzzz", radix: 36) // Out of range