프로그래머스 “자연수 뒤집어 배열로 만들기” 문제 해결과정입니다.
자연수 뒤집어 배열로 만들기
문제설명
자연수 n을 뒤집어 각 자리 숫자를 원소로 가지는 배열 형태로 리턴해주세요. 예를들어 n이 12345이면 [5,4,3,2,1]을 리턴합니다.
제한사항
- n은 10,000,000,000이하인 자연수입니다.
입출력 예
| n | result |
|---|---|
12345 | [5,4,3,2,1] |
문제 해결과정
프로그래머스 코드
import java.util.*;
class Solution {
public int[] solution(long n) {
List<Integer> list = new ArrayList<>();
for(int i = n.length-1; i >= 0; i--) {
list.add((int) n[i]);
}
return Arrays.toString(list.toArray());
}
}
문제는 간단했다. long 형태의 숫자 배열을 뒤집어서 출력하는 것인데, 왜 인지 프로그래머스에서 n.length가 long 형태에서는 사용할 수 없다고 말한다. 이클립스에서는 여러가지 테스트를 해봤는데… 때문에 정작 프로그래머스에서 해결된 코드는 아래 한 줄 코드 1뿐이다. 위 프로그래머스 코드와 한 줄 코드 2는 이클립스에서만 작동하고 프로그래머스에서는 length에러로 넘어가지 못했다. 그래도 설명하자면 먼저 숫자 배열을 담아줄 Integer의 리스트를 만들어주고, 끝에서부터 0까지 리스트에 담도록 한 뒤 출력한다.
한 줄 코드 1
class Solution {
public int[] solution(long n) {
return new StringBuilder(String.valueOf(n)).reverse().toString().chars().map(c -> c - '0').toArray();
}
}
위 코드는 StringBuilder에서 valueOf로 n의 값을 문자열로 반환 한 뒤 뒤집는다. 이후 뒤집힌 문자열을 반환한 뒤 문자열 내의 각 문자를 IntStream으로 반환한다. map(c -> c – ‘0’)이 중요한데 예를 들어 아스키 코드에서 ‘5’는 53을 뜻한다. ‘0’은 48을 뜻한다. 여기서 문자 ‘5’를 문자 ‘0’으로 빼주게 되면 숫자 5가 반환된다. 이를 int배열화 하여 반환한다.
한 줄 코드 2
import java.util.stream.*;
class Solution {
public int[] solution(long n) {
return Arrays.toString(IntStream.rangeClosed(1,n.length).map(i -> (int)n[n.length-i]).boxed().toArray());
}
}
IntStream에 rangeClosed 메소드로 반복문을 반환한 뒤 map으로 n의 끝부터 하나씩 배열화 한다.
정리
- StringBuilder로 n을 문자열화 한다.
- 문자열화 한 n을 뒤집은 뒤(reverse()) 문자열로 다시 반환(toString)
- chars로 문자를 IntStream화 한 뒤에 map에서 문자 ‘0’을 빼준다.
- 이후 배열화(toArray())