문제 설명

자연수 n을 뒤집어 각 자리 숫자를 원소로 가지는 배열 형태로 리턴해주세요. 예를들어 n이 12345이면 [5,4,3,2,1]을 리턴합니다.

 

제한 조건

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

 

입출력 예

n return
12345 [5, 4, 3, 2, 1]

 


 

1차 시도

class Solution {
    public int[] solution(long n) {
        String input = String.valueOf(n);
        
        int[] answer = new int[input.length()];
        
        for(int i = 0; i < input.length(); i++){
            answer[input.length() - (i + 1)] = Integer.valueOf(input.charAt(i) - '0');
        }
        
        return answer;
    }
}

 

1. 입력받은 값의 길이를 구하기 위해 문자열로 변환

2. 변환한 문자열의 각 문자를 answer 배열에 저장

-> 배열에 의도한 값이 아니라 유니코드 값이 저장되어 출력되는 오류 발생

3. '0'의 유니코드 값을 마이너스 연산해서 의도한 값이 출력되도록 함 ('5'의 유니코드(53) - '0'의 유니코드(48) = 5)

 


2차 시도

1차 시도에 작성한 코드도 주어진 문제는 잘 실행되지만, 문자열이 입력되는 상황에서도 잘 동작하는 코드를 만들고 싶어서 2차 시도를 진행하게 되었다.

import java.util.ArrayList;
import java.util.List;

class Solution {
    public int[] solution(long n) {
        List<Long> list = new ArrayList<>();
        
        while(n>0){
            list.add(n%10);
            n/=10;
        }
        
        return list.stream().mapToInt(Long::intValue).toArray();
    }
}

 

1차 시도와는 다르게, 리스트를 사용해서 값을 바로 집어넣으면 for문의 인덱스로 각 위치에 접근할 필요가 없다.

1. `n%10` 연산자로 1의 자리 수부터 리스트에 넣어준다.

2. 저장한 값은 `n/=10`으로 버린다.

3. 값을 다 넣어서 더이상 남은 수가 존재하지 않으면 n은 0이 되고, 반복문 종료

4. mapToInt()로 각 데이터를 IntStream으로 변환

5. Long 클래스 내부의 intValue 메서드를 통해 long이었던 n값을 int로 변환

6. toArray() 메서드로 배열로 반환

 

n%10을 하면 list에 저장될 값은 한 자리의 정수인데, 왜 굳이 List<Long> 타입으로 정의해야 할까?
solution() 메서드에 전달된 n이 long타입이기 때문에 list에 들어갈 값이 한 자리의 정수여도, 그 값은 long 타입이다.

 

 

만약 list의 타입 매개변수를 Integer라고 지정하면 이미지와 같은 에러가 발생하게 된다.