카테고리 없음

2024-04-26 [Kotlin PROGRAMMER 문제 풀이]

Glen_check 2024. 4. 26. 22:00

CASE (자연수 뒤집어 배열로 만들기)

자연수 n을 뒤집어 각 자리 숫자를 원소로 가지는 배열 형태로 리턴해주세요.

예를들어 n이 12345이면 [5,4,3,2,1]을 리턴합니다.제한 조건

  • n은 10,000,000,000이하인 자연수입니다.

 

내가 풀어본 문제 풀이

class Solution {
    fun solution(n: Long): IntArray {
        val answer = IntArray(n.toString().length)
        var addN = n
        var i = 0

        while(addN != 0L) {
            answer[i] = (addN % 10).toInt()
            addN /= 10
            i += 1
        }
        return answer
    }
}

문제를 풀어보기 전, 그려본 전제는 다음과 같다.

n을 임의의 변수에 저장

10으로 나누면 나머지 값은 일의 자리 수가 될 것이고 그 수를 0번째 인덱스부터 차례대로 저장,

n을 저장한 임의의 변수를 10으로 나누는 것을

while 문을 통해 반복한다.

 

*매개변수 n의 경우 Long Type 으로 설정되어 있는데, 이게 문제를 푸는데 다소 어려움을 줄지는 몰랐다.

 

이전 배열 관련 문제를 풀 때 배열의 크기를 정해준 후,

인덱스마다 수를 대입하는 것이 컴파일 속도 개선에 도움이 된다는 것을 보아 배열의 크기를 지정해주었는데 배열을 문자형으로 변환 후 문자열의 길이를 배열의 크기로 지정해주었다.

 

이후 n을 addN 변수에 별도로 저장한 후 addN이 0이 아닐 때는 지속적으로 while 문을 반복해서 돌 수 있도록 설정했다.

여기서 예상치 못한 문제는 Long 타입이다 보니 0 끝에 'L'을 붙여야 한다는 것이다.

그리고 배열에 0번째 인덱스부터 차례대로 끝의 수를 넣어주며 문제 풀이를 진행하였다.

 

아 그리고, 배열에 수를 넣어주는 과정에서 타입이 Long이다 보니 타입이 맞지 않아 오류가 발생하여 .toInt로 형변환을 시켜줘야한다.

 

결국 문제를 풀긴 풀었는데 다른 사람들의 풀이를 보고 충격을 먹었다.

가장 많이 제출한 코드는 아래와 같다.

 

다른 사람들의 문제 풀이

class Solution1 {
    fun solution(n: Long): IntArray {
        return n.toString().reversed().map { it.toString().toInt() }.toIntArray()
    }
}

이게 끝이다. 아직까지 문법들을 잘 몰라 기본 중 기본으로 구현하려다 보니 코드가 길어지는구나 싶었고, 그래서 다른 사람들의 풀이를 보고 이해해보는 것이 큰 도움이 된다.

간단한 코드여도 이해가 되지않아 구글링을 해보았고, 결국 튜터님께 찾아가 설명을 들었다.

 

우선 n을 String타입으로 변환 후 뒤집는다.

 

이 과정에서 예시로 n이 1234 라면, 해당 과정을 거쳐 n은 "4321" 이 되며

.map을 통해 문자열 하나 하나 불려가 (4, 3, 2, 1)  {} 안에 명령어를 따른다. 그래서 it은 순서대로 4, 3, 2, 1을 뜻하며 해당 문자열을 String으로 변환 후 Int로 변환하여 최종적으로 Int 배열로 만드는 것이다.

 

그러면 왜 문자열을 다시 한 번 String으로 변환하는 과정을 거칠까?

정답은 map을 거치면 it은 Char 타입으로 하나 하나 소환되기 때문에 Char 타입을 바로 Int 타입으로 변환 시 이상한 숫자가 나오는 걸 확인할 수 있다.

 

구체적으로 Char타입을 Int로 변환하면 "1"이 1로 변환되는 것이 아닌,

아스키 코드 번호로 변환된다.

 

그러면 .map 에서 바로 Int로 변환은 할 필요가 없을까? 아니다.

문자열이 0 ~ 9 사이가 아닌, A,가, a 등 과 같은 경우 String 타입일 때 Int 타입으로 변환하지 못하기 때문에 다음과 같은 경우 바로 Int로 변환해야 한다.

 

오늘 튜터님께 조언을 받아

알고리즘 문제를 풀기 전, 아니면 프로젝트나 과제와 같이 코드를 작성해야 하는 경우 그림을 먼저 그려보고 풀어나가기 시작했다.

문제를 정의하고, 구조를 생각하고, 문법을 생각하고 고려해야 할 문제가 너무 많아 문제를 차근차근 하나하나 해결해나가는데 큰 도움이 될 것 같다!