출처: https://school.programmers.co.kr/learn/courses/30/lessons/12932
문제 설명
자연수 n을 뒤집어 각 자리 숫자를 원소로 가지는 배열 형태로 리턴해주세요. 예를들어 n이 12345이면 [5,4,3,2,1]을 리턴합니다.
제한 조건
n은 10,000,000,000이하인 자연수입니다.
입출력 예
n return
12345 [5,4,3,2,1]
내가 작성한 코드
import java.util.*;
class Solution {
public int[] solution(long n) {
// long을 String으로 변환
String str = Long.toString(n);
int[] answer = new int[str.length()];
for(int i = str.length() - 1; i >= 0 ; i--){
// 각 자릿수 별로 answer 배열에 저장.
answer[str.length() - 1 - i] = str.charAt(i) - '0';// 문자->숫자
}
return answer;
}
}
처음에 int형 변환도 시도 해보고 그랬다.
import java.util.*;
class Solution {
public int[] solution(long n) {
int N = (int) n;
int[] answer = new int[N];
for(int i = 0; i < answer.length; i++){
answer[i] = N % 10;//각 자릿수를 answer 배열에 저장.
N /= 10; //그런담에 몫은 n에 저장.
}
return answer;
}
}
0, 0, 0, 0...이 계속 저장되는 현상이 생겼다.
n은 long 타입이다. 만약 n이 2147483648 (int 최대값 2,147,483,647보다 큼) 같은 큰 값이면,
(int) n에서 데이터 손실이 발생한다. 그래서 N에 엉뚱한 값 또는 0이 들어간다.
또한:
for(int i = 0; i < answer.length; i++){
answer[i] = N % 10;
N /= 10;
}
만약 N이 이미 0이면, 이 루프에서 계속 0 % 10 = 0이 되고, N /= 10 해도 계속 0이므로
answer.length 횟수만큼 0이 채워진다.
long n을 그냥 int N = (int) n;으로 바꾸니 값이 깨짐 (특히 n이 큰 경우).
그래서 결국 N이 0이 되어버림 → 루프가 돌아도 0만 계속 들어감.
import java.util.*;
class Solution {
public int[] solution(long n) {
// long을 String으로 변환
String str = Long.toString(n);
int[] answer = new int[str.length()];
for(int i = str.length() - 1; i >= 0 ; i--){
// 각 자릿수 별로 answer 배열에 저장.
answer[str.length() - 1 - i] = str.charAt(i) - '0';// 문자->숫자
}
return answer;
}
}
핵심 요약:
long → int 변환 시 오버플로우 발생 (값 깨짐)
그래서 그냥 String으로 변환 후 char 처리하는 게 안전함.
그리고..
문자-> 정수 변환 관련해서..
자바에서 char는 사실 숫자 (유니코드 값) 임.
예를 들어:
System.out.println((int)'0'); // 48
System.out.println((int)'1'); // 49
System.out.println((int)'2'); // 50
즉, 문자 '0'의 정수 값은 48이다.
그래서 '3' - '0' 하면?
'3'의 코드 값: 51
'0'의 코드 값: 48
-------------------------
'3' - '0' == 51 - 48 == 3
예제:
char ch = '7';
int num = ch - '0'; // '7' - '0' = 55 - 48 = 7
System.out.println(num); // 7
String s = "12345";
for (int i = 0; i < s.length(); i++) {
int num = s.charAt(i) - '0'; // 각각 1,2,3,4,5
}
다른 사람의 풀이
import java.util.stream.IntStream;
class Solution {
public int[] solution(long n) {
return new StringBuilder().append(n).reverse().chars().map(Character::getNumericValue).toArray();
}
}
class Solution {
public int[] solution(long n) {
String a = "" + n; // 1. n을 문자열로 변환 ("12345"처럼)
int[] answer = new int[a.length()]; // 2. 자리수만큼 배열 생성
int cnt=0;
while(n>0) { // 3. n의 마지막 자리부터 잘라서 배열에 넣기
answer[cnt]=(int)(n%10); // n의 끝자리 숫자
n/=10; // 끝자리 제거
System.out.println(n); // n 출력 (디버깅용)
cnt++;
}
return answer;
}
}