나 개발자 진짜 되냐?

백준 C++ 2745번 진법 변환 ( 진수는 누적 곱! ) 본문

C++을 시작해봐요!/구현문제를 풀어봤어요!

백준 C++ 2745번 진법 변환 ( 진수는 누적 곱! )

Snow Rabbit 2026. 1. 12. 20:56

 

나는 Mr.mine이라는 게임을 즐겨한다.

 

방금 찍은 사진인데.. 천시간이 넘었네...

ㅋㅋㅋㅋ 사실 방치형 광산게임이다 보니까..

아직... 한참 멀었다.

 

2566km가 끝인데

나는 이제 1586km이다.

1km를 파는 데 걸리는 시간은..

 

... 뭐 사실 게임을 켜두면 가끔 빨리 파지는 버프를 받을 수 있긴 한데..

오프라인으로 내버려둔다면 85시간 뒤에 1km를 파는 셈이다.

ㅋㅋㅋㅋㅋㅋ그러니 천시간이 넘어버렸네.

 

 

이렇게 파기만 해도 되나? 싶어서

I 임에도.. 정보를 얻기 위해 들어가게 된 디스코드 커뮤니티..

한국사람들은 별로 없지만.. 외국인들이 꽤 활발하게 대화가 오고 가고 있었다.

 

나 같은 사람이 이렇게 많다니... 하며 ㅋㅋ 감탄했다.

 

어제는 게임을 플레이하며 아무리 해도 안 나오는 유물 때문에

나오는 게 맞는 건가???? 싶어서 그 커뮤니티에 처음으로 채팅을 남겼다.

 

어떤 분이 유물은 실존한다고 해주셨고 ㅋㅋ

그거에 대한 꿀팁도 주셨다.

감사하다고 말씀드리고.. 이분은 어떻게 이렇게 잘 아는 걸까? 하며 디스코드를 보는데

꽤 고위직?이라고 해야 할까

일반인이 아니었다. 개발자 같았다.

켜놓은지 200시간 됐다고 적혀있었다. 개발자인가 보다.. 근데 아직 이게임을 개발하고 계신 건가? 싶기도 하고..

 

기분이 굉장히... 뭐랄까 벅찼달까??

나도 나중에 어느 한 게임의 개발자가 되어

누군가에게 이런 꿀팁을 주는 사람이 될 수 있을까.. 하며

마음을 크게 부풀리기도 했다.

 

ㅋㅋㅋㅋ썰이 꽤 기네...

지금 시점을 기념? 하기 위한 나의 돈자랑.

 


B진법수...?

 

뭐지.. z는 35인데.. 36진수가 있다는 건가?

일단 10억 정도라고 알려주었으니 int인건 알겠는데

진짜 이건 푸는 것도 푸는 건데 진짜 문제를 이해하는 게 저어어엉말 힘든 거 같다.

 

일단 어떠한 진법을 10진법으로 바꾸라는거 같은데..

 

지 선생에게 물어보았다.

 

10진법은

0부터 9까지 표현 가능하다.

그니까 B 진법, 여기서는 36까지 된다고 하니까..

36진수는

0부터 35까지 표현이 가능하다는 뜻이 된다.

 

228이라는 숫자를 10진법으로 한다면

2 * 100 + 2 * 10 + 8 * 1

 

이렇게 각 자릿수마다 0이 추가되는 모습.

 

그래서 ZZ를 36진수 하게 된다면

z는 35니까

35 * 36 + 35 * 1 = 1295가 된다.

 

ZZZZZ 36이라면

35 * 36^4 + 35 * 36^3 + 35 * 36^2+ 35 * 36 + 35 * 1 

가 되는 것이다.

 

흠....

 

일단 36까지 알려주며 Z를 설명해 주는 거 보니..

문자열로 접근해야 할 거가 같고..

이다음이 문제인데

 

A는 10, B는 11... Z는 35를 어떻게 다 하나하나 적겠는가..

그리고 결국 문자열로 하나씩 다 잘라야 하는데..

for로 잘라도 되려나..? 헷갈린다.

 

결국 지 선생에게 물어봤는데.....

 

1. 0부터 9까지 들어오는 경우가 있고, A부터 Z까지 인경우를 두 가지로 나눠서 생각해야 한다.

 

그래서 나누어주었다.

나누어주고

문자열이니까 숫자로 표시하기 위해서는 

'0'을 해줘야 하고

문자열도 결국 숫자로 더해주기 때문에

'A'를 해줘야 한다

그리고 A의 시작은 10이기 때문에

글자에서 A 빼주고 더하기 10 해줘야 한다. 

 

여기서 특이했던 문제 방식이 있다.

 

123의 경우

왼쪽의 숫자가 가장 큰 자릿수인데..

이 문제를 풀려면 맨 왼쪽부터 풀어야 하는데

몇 글자인지 모르면 풀 수가 없다는 것이었다.

 

근데 지피티가 새로운 시각을 알려주었다.

 

1을 하고 *10 하고 +2 하고 또 *10 하고 +3 하면 답이 같다는 사실이다!!

으잉? 이게 무슨...??

 

기존 값을 키우면서 더하는 방식으로 하면

거듭제곱을 외울 필요도 없다는 것이다.

 

1A2F 16

인경우

 

0 * 16 + 1 = 1

1 * 16 + 10 = 26

26 * 16 + 2 = 418

418 * 16 + 15 = 6695

 

반대로

1 * 16^3 + 10 * 16^2 + 2 * 16 + 15 * 1

= 6695

가 나오게 된다.

 

아니 어떻게 이게 가능한 거지..?!

분배법칙 덕분이라고 한다.

누적 곱 방식이라고도 하며

저 위에 식을 그대로 가져와서 쓰면

 

(((0*16 + 1)*16 + 10)*16 + 2)*16 + 15

인 거고 이것을 분배법칙으로 나누면

1*16^3 + 10*16^2 + 2*16^1 + 15*16^0

 

이렇게 된다는 것이다.

그래서

 

이 식을 그대로 쓰면

ans * n + ( c-'0')

혹은

ans * n + (c-'A'+10) 이 된다.

 

 

흠..... 여기서 내가 헷갈렸던 이유를? 생각해 보면

처음에 지 선생은 나에게 이렇게 설명해주지 않아서였던 거 같기도 하다.

 

처음에는 나에게

고정적으로 곱해주는 값이 있고, 더해주라고 했었어서..

뭘 곱해주라는 건지 뭘 더하라는 건지 정말 도통 몰랐었다....

 

미리 곱하기를 해주어서

다음에는 그냥 더하기만 해주는 방식이다.

아까보다 식은 더 간단한데

해석하기엔 훨씬 어려웠다.

 그래서 조금? 더 쉬운 방법을 알려달라 해서 위의 식을 알게 되었다.

 


 

사실 오늘 날짜로 지 선생의 프로생활은 끝났다.

무료버전이라 그런지...설명을 이해하는데 조금 어려워졌다......

ㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋ....

스읍 미안하다.

 

 

그래도

확실한 건

진수의 값을 구할 땐

각 자릿수에 따라 ^5 ^4 이렇게 해줄 필요 없이

이렇게 누적 곱을 해주면 된다는 사실을 알게 되었다.

신기하다.

신기하다.

또 내가 몰랐던 수학 공식을 하나 알았다.

재밌다.

아니 안 재밌다.

하나도 안 재밌다.

이래서 내가 코테 문제 풀겠냐고오오오오오

 

빼애애액