목록으로

Programming Notes

DAY-16] 231218 TIL(Spring 입문 1주차) - 3진법 뒤집기와 오버플로우의 늪

오늘은 Spring 입문 1주차를 마무리하면서 알고리즘 문제 하나를 풀어봤습니다. 문제는 자연수를 3진법으로 변환하고, 그 3진법 수를 뒤집은 후 다시 10진법으로 변환하는 것이었습니다. 처음에는 간단해 보였습니다. 3진법 변환은 익숙한 과정이고, 문자열을 뒤집는 것도 어렵지...

오늘은 Spring 입문 1주차를 마무리하면서 알고리즘 문제 하나를 풀어봤습니다. 문제는 자연수를 3진법으로 변환하고, 그 3진법 수를 뒤집은 후 다시 10진법으로 변환하는 것이었습니다. 처음에는 간단해 보였습니다. 3진법 변환은 익숙한 과정이고, 문자열을 뒤집는 것도 어렵지 않으니까요. 하지만, 예상치 못한 함정이 기다리고 있었습니다.

문제의 핵심은 자연수를 3진법으로 바꾸는 과정입니다. 숫자를 3으로 계속 나누면서 나머지를 기록하고, 이 나머지를 문자열로 만들어 뒤집은 다음 다시 10진수로 변환하는 방식입니다. 3으로 나누고 나머지를 저장하는 과정은 재귀 함수를 이용해도 되고, 반복문으로 구현해도 됩니다. 저는 반복문을 선택했는데, 문자열을 뒤집는 과정은 StringBuilder 클래스의 reverse() 메서드를 사용하여 간편하게 처리했습니다. 3진법에서 10진법으로의 변환은 뒤집힌 3진법 문자열을 순회하며 각 자릿수에 해당하는 3의 거듭제곱을 곱한 값들을 모두 더하면 완료됩니다. 이론적으로는 간단 명료하지만, 실제 코딩에서는 예상치 못한 문제에 부딪혔습니다.

바로, 매개변수로 들어오는 자연수의 크기였습니다. 문제에서 제시한 범위는 1 이상 100,000,000 이하였는데, 처음에는 이 범위를 고려하지 않고 코드를 작성했습니다. 그 결과, 큰 수를 입력했을 때 중간 과정에서 숫자가 int형의 최대값을 넘어서 오버플로우 에러가 발생했습니다. 결국, long 타입을 사용하여 숫자 범위를 확장해야 했습니다. 오버플로우 문제 해결에 시간을 상당히 소비했는데, 이 과정에서 꼼꼼한 자료형 선택과 범위 고려의 중요성을 다시 한번 깨달았습니다. 결론적으로는 long 타입을 사용하고 나서야 모든 테스트 케이스를 통과할 수 있었습니다. 이 문제를 통해 큰 숫자를 다룰 때 발생할 수 있는 오버플로우 문제에 대한 경험과 자료형 선택의 중요성을 실제로 경험하며 배울 수 있었습니다.

오늘 알고리즘 문제를 풀면서 3진법 변환 자체는 어렵지 않았지만, 큰 수를 처리하는 과정에서 예상치 못한 오버플로우 에러를 만나 해결하는 데 시간을 많이 소비했습니다. 하지만 이 과정을 통해 더욱 꼼꼼한 코딩 습관과 자료형 선택의 중요성을 몸소 느낄 수 있었던 좋은 경험이었습니다. Spring 공부와 함께 알고리즘 문제 풀이도 꾸준히 병행해야겠습니다.