728x90
Overview
- 체감 난이도: ★★☆☆☆
- 문제 레벨: 실버 3
- 문제 유형: 진법, 구현
- 풀이 상태: 답안참고 / 스스로 해결
- 추후: 다시 풀어보기 / 간단 복습 / 완벽 이해
[문제]
* 일단 문제에 오타가 있다.
\(3^{2}\) + \(3^{1}\) + \(3^{0}\) 인데, \(3^{1}\) + \(3^{1}\) + \(3^{0}\) 이라고 되어 있다.
우선, 3진법과 비슷하게 나타난다고 했다.
3진법은 10진법으로 나타낸 수를 3으로 나눈 나머지들로 나타내는 것이다.
ex) 10진법 : 11
11 / 3 = 3 ... 2 (-> 나머지인 2 추가)
3 / 3 = 1 ... 0 (-> 0 추가)
1 / 3 = 0 ... 1 (-> 1 추가)
=>> 3진법 : 102 가 된다. (추가한 순서의 반대로 작성)
다만 이 문제에서는 3진법 자리 숫자 0, 1, 2 가 아닌 -1, 0, 1을 사용한다고 했다.
표현할 때는 -1 을 - 로 간단하게 나타낸다고 했다.
1과 0은 원래 3진법 방법으로 나머지를 추가해주면 되지만,
2와 음수는 다른 방법으로 추가해주어야 한다.
(-2)를 만들어 줄 수 있는 방법은,
(-1) * \(3^{1}\) + 1 * \(3^{0}\) = -3 + 1 = -2 이므로
2를 만들어 줄 수 있는 방법도 마찬가지로,
1 * \(3^{1}\) + (-1) * \(3^{0}\) = 3 + (-1) = 2 이다.
>> 3 - 1 로 보기 때문에, 몫에 1을 더해주며 3을 만들어주고, -1을 기록한다.
예를 들어 2를 변환하면:
- 처음에 2 % 3 = 2가 나옴
- 2가 나오면 "아, 이건 3-1이구나"라고 생각
- 그래서 현재 자리에 - 를 쓰고
- 3을 만들어주기 위해 다음 자리에 1을 더해줌
-1 이 나머지로 나오는 경우는 "-" 를 추가해준다.
[코드]
def solution(n):
if n == 0: return "0"
ans = ''
while n:
r = n % 3
n = n // 3
if r == 2 or r == -2:
n += 1
ans += '-'
elif r == -1:
ans += '-'
else:
ans += str(r)
return ans[::-1]
T = int(input())
for _ in range(T):
n = int(input())
print(solution(n))
* 조건 부분은 abs를 이용하여 간략하게 나타낼 수 있다.
if abs(r) == 2 or r == -1:
if abs(r) == 2: n += 1
ans += '-'
반응형
'🚩 Coding Test > Baekjoon' 카테고리의 다른 글
[BOJ][Python] 32344 유물 발굴 (0) | 2025.01.18 |
---|---|
[BOJ][Python] 29753 최소 성적 (0) | 2025.01.17 |
[BOJ][Python] 25179 배스킨라빈스~N~귀엽고~깜찍하게~ (0) | 2025.01.15 |
[BOJ][Python] 27357 부가세 (0) | 2025.01.14 |
[BOJ][Python] 3054 피터팬 프레임 (0) | 2025.01.13 |