공부/프로그래머스

[프로그래머스 Lv. 1] 자연수 뒤집어 배열로 만들기 - JAVA

해니0 2024. 8. 5. 08:00

문제

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

class Solution {
    public int[] solution(long n) {
        int[] answer = {};
        return answer;
    }
}

제한사항

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

입출력 예

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

문제 풀이

분석

자릿수마다 숫자를 빼오는 방법 고민 

- 수학적인 방법 & 문자열 변환 방법이 있음 

- 문자열 변환보다 수학적인 방법을 이용하는게 알고리즘의 이해라고 생각해서 수학적인 방법 선택

숫자 직접 처리 방식: 성능과 메모리 사용 측면에서 더 효율적. 숫자가 크고 자릿수가 많을 때 성능 차이 두드러짐
문자열 변환 방식: 가독성과 코드의 직관성을 중시할 때 유용. 자릿수가 적은 작은 숫자에 대해서는 성능 차이가 거의 없으므로, 이해하기 쉬운 코드를 원할 때 선택

ArrayList를 이용해 add(int), 입력받은 수의 size() 체크하고 get(i)을 이용해 다시 빼서 배열에 담아줌

 

내 소스코드

import java.util.*;

class Solution {
    public int[] solution(long n) {
        // 각 자릿수를 담을 리스트 선언
        List<Integer> digitList = new ArrayList<>();

        // 숫자가 0이 될 때까지 반복
        while (n > 0) {
            int digit = (int)(n % 10); // 현재 자릿수를 구함
            digitList.add(digit); // 리스트에 추가
            n /= 10; // 다음 자릿수로 이동
        }

        // 리스트를 배열로 변환
        int[] answer = new int[digitList.size()];
        for (int i = 0; i < digitList.size(); i++) {
            answer[i] = digitList.get(i);
        }
        return answer;
    }
}

 

다른 예시 1

import java.util.stream.IntStream;

class Solution {
    public int[] solution(long n) {
        return new StringBuilder().append(n).reverse().chars().map(Character::getNumericValue).toArray();
    }
}

 

다른 예시 2

class Solution {
  public int[] solution(long n) {
      String s = String.valueOf(n);
      StringBuilder sb = new StringBuilder(s);
      sb = sb.reverse();
      String[] ss = sb.toString().split("");

      int[] answer = new int[ss.length];
      for (int i=0; i<ss.length; i++) {
          answer[i] = Integer.parseInt(ss[i]);
      }
      return answer;
  }
}

 

추가로 고민 할 부분

다른 예시 1에서 다양한 함수를 사용했다

return new StringBuilder()
    .append(n) // 1. 숫자 n을 StringBuilder에 추가
    .reverse() // 2. StringBuilder를 뒤집어 문자열을 반전시킴
    .chars() // 3. 문자열을 IntStream(각 문자의 유니코드 값을 나타내는 스트림)으로 변환
    .map(Character::getNumericValue) // 4. 각 문자를 해당하는 숫자 값으로 변환
    .toArray(); // 5. 결과를 int 배열로 변환하여 반환

 

같은 문제여도 다양한 풀이법이 많다

 


Lv.1  / Java / 연습문제

출처: 프로그래머스 코딩 테스트 연습, https://school.programmers.co.kr/learn/challenges