오늘은 호텔 예약 시스템 개발에 박차를 가하기 전에, 잠시 머리를 식힐 겸 코틀린 알고리즘 문제 하나를 풀어봤습니다. 문제는 바로 "정수 내림차순으로 배치하기". 간단히 말해, 주어진 정수의 각 자릿수를 내림차순으로 정렬해서 새로운 정수를 반환하는 것이죠. 얼핏 보면 정렬 알고리즘을 직접 구현해야 하나 싶었지만, 코틀린의 강력한 형변환과 내장 함수들을 활용하면 훨씬 쉽게 풀 수 있다는 사실! 하지만... 역시나 한 번에 정답을 맞히는 건 쉽지 않네요.
삽질의 향연, 그리고 깨달음
처음에는 다음과 같은 흐름으로 문제를 해결하려 했습니다.
- 정수를 문자열로 변환:
num.toString() - 문자열을 리스트로 변환:
.toList() - 리스트를 내림차순 정렬:
.sortedDescending() - 리스트를 문자열로 변환:
.toString() - 문자열을 정수로 변환:
.toLong()
그래서 자신만만하게 num.toString().toList().sortedDescending().toString().toLong() 코드를 작성했죠. 하지만 결과는 예상과는 달랐습니다. sortedDescending()까지는 좋았는데, 리스트를 문자열로 변환하는 과정에서 [8, 7, 3, 2, 1, 1]과 같은 형태의 문자열이 반환되는 것이었습니다! 우리가 원하는 건 "873211"인데 말이죠.
여기서 중요한 사실을 깨달았습니다. toString()은 리스트 자체를 문자열 형태로 표현하는 것이지, 리스트의 각 요소를 연결하여 하나의 문자열로 만들어주는 것이 아니라는 것을요.
해결 방법은 간단했습니다. joinToString("") 함수를 사용하면 리스트의 모든 요소를 하나의 문자열로 합칠 수 있습니다. 즉, num.toString().toList().sortedDescending().joinToString("").toLong() 코드를 사용하면 원하는 결과를 얻을 수 있습니다!
작은 삽질이 주는 교훈
단순해 보이는 알고리즘 문제였지만, 코틀린의 자료형 변환과 문자열 조작에 대해 다시 한번 생각해 볼 수 있는 계기가 되었습니다. 특히, toString()과 joinToString("")의 차이점을 명확히 알게 된 것이 큰 수확입니다. 앞으로 호텔 예약 시스템을 개발하면서 더욱 복잡한 문자열 처리 로직을 다루게 될 텐데, 오늘 경험이 큰 도움이 될 것 같습니다. 작은 문제 하나라도 꼼꼼하게 해결하고 넘어가는 습관을 들여야겠습니다. 이제 다시 호텔 예약 시스템 개발에 집중해야겠네요!