스프링 입문 첫 주, 정신없이 흘러갔습니다. 새로운 프레임워크를 배우는 설렘과 동시에 쏟아지는 정보량에 살짝 정신이 혼미해지기도 했네요. 그래도 하나씩 차근차근 익혀가며 앞으로의 프로젝트를 위한 기반을 다지는 중입니다. 그러던 와중, 잠시 머리를 식힐 겸 알고리즘 문제를 풀었는데, 생각보다 간단해 보이는 3진법 문제가 발목을 잡았습니다.
뒤집고, 나누고, 곱하고... 생각보다 까다로운 3진법 변환
문제는 간단했습니다. 주어진 10진수 자연수를 3진법으로 변환한 뒤, 앞뒤를 뒤집고, 다시 10진수로 변환하는 것이었죠. 처음에는 '이 정도야 껌이지!'라고 생각했습니다. 3으로 계속 나누면서 나머지를 문자열에 추가하고, 문자열을 뒤집은 다음, 각 자리에 3의 거듭제곱을 곱해 더하면 끝이니까요.
코드를 짜기 시작했습니다. 숫자를 3으로 나눈 나머지를 문자열 변수에 계속 추가하고, 숫자를 3으로 나누는 과정을 반복했습니다. 문자열에 나머지를 추가하는 과정 자체가 뒤집는 과정이 되니, 별도의 뒤집기 로직은 필요 없었습니다. 그렇게 얻은 3진법 문자열을 다시 10진수로 변환하기 위해 각 자릿수를 순회하며 3의 제곱을 곱해 누적했습니다.
그런데 문제가 발생했습니다. 테스트 케이스에서 계속 오류가 나는 겁니다. 디버깅을 해보니, 3진법으로 변환하는 과정까지는 문제가 없었습니다. 문제는 다시 10진수로 변환하는 과정에서 발생했습니다. 바로 오버플로우 때문이었죠!
매개변수로 주어지는 자연수 n의 범위가 1 이상 1억 이하인데, 이를 3진법으로 변환했을 때 자릿수가 늘어나면서 3의 거듭제곱을 곱하는 과정에서 int 범위를 넘어버린 것입니다. 문제를 풀기 전에 매개변수 범위를 꼼꼼히 확인했어야 했는데, 너무 안일하게 생각했던 탓입니다.
교훈과 함께 마무리
결국 변수 타입을 long으로 변경하여 오버플로우 문제를 해결하고 나서야 문제를 풀 수 있었습니다. 간단한 문제라고 얕봤다가 예상치 못한 곳에서 시간을 많이 잡아먹었네요. 이번 문제를 통해 얻은 교훈은,
- 문제 풀이 전 매개변수의 범위를 꼼꼼히 확인하고 자료형을 신중하게 선택해야 한다.
- 단순해 보이는 문제도 예상치 못한 함정이 있을 수 있으므로, 꼼꼼하게 디버깅해야 한다.
스프링 입문 첫 주, 3진법 문제 덕분에 더욱 정신을 바짝 차리게 되었습니다. 앞으로도 꾸준히 배우고 익히면서 스프링 마스터가 되는 그날까지 열심히 달려가야겠습니다.