[오늘의 문제] 자연수 뒤집어 배열로 만들기

shlim55·2025년 6월 23일

코딩테스트

목록 보기
85/223

출처: 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;
  }
}
profile
A Normal Programmer

0개의 댓글