🔴 문제
링크: https://school.programmers.co.kr/learn/courses/30/lessons/68935
문제 설명
자연수 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으로 연쇄적으로 나누어 나온 일련의 나머지들을 구하고, 가장 마지막으로 나온 나머지부터 순차적으로 읽는다.
▶️ n진수 -> 10진수 변환법
n진수의 각 자리에 n의 i승을 곱하여 더한다.
▶️ pow(_:_:)의 리턴 타입은 Decimal이다.
=> pow의 인자를 Float이나 Double로 입력하라!
참고: angie.log(링크)
=> 리턴 타입이 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:) 또한 초면이기에... 몇 번 부딪혀 보니 사용 방법을 알 수 있었다.
10진수를 n진수로 바꿀 때 : String(숫자, radix: n)
=> 물론 반환값은 String형으로 나온다.
n진수를 10진수로 바꿀 때 : Int(문자열, radix: n)
=> 반환값은 Int형이다.
공식 문서 (링크)
추가 정보
- 부호 사용이 가능하다
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
'Swift > Code Kata (알고리즘)' 카테고리의 다른 글
[Swift|코드카타] (프로그래머스) # 42. 삼총사 - 반복문 3개 중첩 (0) | 2024.03.14 |
---|---|
[Swift|코드카타] (프로그래머스) #41. 이상한 문자 만들기 - .uppercased(), .lowercased() (0) | 2024.03.14 |
[Swift|코드카타] (프로그래머스) #39. 최대공약수와 최소공배수 (0) | 2024.03.12 |
[Swift|코드카타] (프로그래머스) #38. 직사각형 별찍기 - readLine(), components(seperatedBy:) (0) | 2024.03.12 |
[Swift|코드카타] (프로그래머스) #37. 행렬의 덧셈 (0) | 2024.03.11 |