본문 바로가기

PS/백준

[BOJ] 백준 2745 진법 변환 (Swift)

반응형

문제

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 함수 써도 된다..

소스코드

후기

진법에 대한 이해가 있다면 직접 변환하여 풀어도 어렵지 않은 문제

반응형