문제
https://www.acmicpc.net/problem/2745
풀이
사실 이 문제는 아주 간단하게 풀 수 있는 문제이다.
Int 자료형에 다음과 같은 이니셜라이저가 존재한다.

이거 하나면 바로 풀 수 있는 문제
하지만 이 문제에서는 위와 같이 푸는것으로 의도하고 있지는 않은 것 같다.
다른 방법으로 풀이하자면, 먼저 진법에 대한 이해가 필요한 것 같다.
음.. 언제 배웠는지 기억은 잘 안나는데, 2진수를 10진수로 변환하는 과정에 대해서는 대부분 알 것이라고 생각한다.
2진수 "110"을 10진수로 변환한다면, 2의 2제곱 * 1 (4) + 2의 1제곱 * 1 (2) + 2의 0제곱 * 0 (0) = 6 과 같이 변환할 수 있다.
예제에 나온 "ZZZZZ" 를 36진수로 변환한다면..?
"ZZZZZ"는 너무 기니깐, "ZZZ" 정도로만 생각해본다면 다음과 같을 것이다.
일단 Z는 35의 수를 의미한다. A가 10 이므로.
2진수를 변환한거랑 마찬가지로, 36의 2제곱 * 35 (45,360) + 36의 1제곱 * 35 (1,230) + 36의 0제곱 * 35 (35) = 46,655 이다.
이를 코드상으로는 어떻게 구현할 수 있을까.
먼저 A,B,C 같은 문자열을 숫자로 바꾸어 주어야 할 것이다.
문자열 중에서도 1, 2, 3 과 같이 숫자로 변환가능한 문자인지, 불가능한 문자인지 Character의 isNumber 프로퍼티로 확인이 가능하다.
불가능 할 때 처리를 해주어야한다.
편하게 구하기 위해 아스키코드 값을 떠올렸으며, A는 65이다.
ABC와 같은 문자열이라면, 아스키코드 값으로 변환하고 65를 뺀 뒤 10을 더하면, A -> 10 과 같이 변환할 수 있다.
물론 55만 빼도 되지만.. 빼고 10 더하는게 더 직관적인 것 같아서 나는 저렇게 했다.
그 이후 제곱하는 함수 만들어줘서 구현하면 된다. 물론 내장된 pow 함수 써도 된다..
소스코드
let input = readLine()!.split { $0 == " " }.map { String($0) } | |
let n = input[0], b = Int(input[1])! | |
print(Int(n, radix: b)) |
func pow(_ base: Int, _ n: Int) -> Int { | |
var answer = 1 | |
for _ in 0..<n { | |
answer *= base | |
} | |
return answer | |
} | |
func convertCharToInt(_ c: Character) -> Int { | |
if c.isNumber { | |
return Int(String(c))! | |
} | |
return Int(c.asciiValue!) - 65 + 10 | |
} | |
let input = readLine()!.split { $0 == " " }.map { String($0) } | |
let n = input[0], b = Int(input[1])! | |
var answer = 0 | |
for (index, n) in (n.reversed()).enumerated() { | |
answer += pow(b, index) * convertCharToInt(n) | |
} | |
print(answer) |
후기
진법에 대한 이해가 있다면 직접 변환하여 풀어도 어렵지 않은 문제
'PS > 백준' 카테고리의 다른 글
[BOJ] 백준 28279 덱 2 (Swift) (0) | 2024.10.29 |
---|---|
[BOJ] 백준 1389 케빈 베이컨의 6단계 법칙 (Swift) (0) | 2024.10.29 |
[BOJ] 백준 18110 solved.ac (Swift) (0) | 2024.02.19 |
[BOJ] 백준 10845 큐 (Swift) (0) | 2024.01.07 |
[BOJ] 백준 1676 팩토리얼 0의 개수 (Swift) (0) | 2024.01.07 |