유난스런 개발 기록

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

알고리즘

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

yourhwan 2023. 7. 28. 21:28

문제 설명

자연수 n을 뒤집어 각 자리 숫자를 원소로 가지는 배열 형태로 리턴해해주세요.

예를들어 n이 12345이면 [5,4,3,2,1]을 리턴합니다.

 

제한 조건

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

 

입출력 예

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

 

 


 

 

나의 풀이 과정

  1. 입력한 숫자를 문자열로 변환해준다.
  2. 변환 되어진 문자열을 역순이 되도록 뒤집어준다.
  3. 뒤집힌 문자열을 문자형태의 배열로 변환해준다.
  4. 변환 되어진 배열의 문자를 숫자로 바꿔준다.

 

나의 코드

class Solution {
    public int[] solution(long n) {
        String str = Long.toString(n);
        String reverse = new StringBuilder(str).reverse().toString();
        char[] arr = reverse.toCharArray();
        
        int[] result = new int[arr.length];
        for(int i = 0; i < result.length; i++) {
            result[i] = arr[i]-'0';
        }
        return result;
    }
    
}

 

가장 먼저 이것을 문자열 형태인 String 타입으로 변환해주는 것이 필요하다.

때문에 String str = Long.toString(); 을 통해 형변환을 해줬다.

문제를 다 풀고 궁금했던 것은 'Long.toString() 말고 다른 형태의 형변환 방법은 없는가?' 였다.

문제를 풀 당시에는 위의 방법만 생각이 났지만 차근히 생각해보니 valueOf()가 있었다.

여기서 깨달은 것은 여태까지 이 둘의 정확한 특징과 차이점을 모른채 사용해왔다는 것이다.

 

이 둘의 특징을 정리해보자면 다음과 같다.  

 

String.valueOf()

  • 해당 메서드는 Java API의 일부인 String 클래스에 정의되어 있다.
  • int, double, boolean 등과 같은 다양한 유형의 입력을 처리할 수 있는 오버로드된 메서드다.
  • 만약 long을 String.valueOf()에 인수로 전달하면 내부적으로 Long.toString() 메서드를 사용하여 long을 문자열로 형변환 한다.
  • 즉, 해당 메서드는 다양한 데이터 유형을 처리할 수 있기 때문에, 편리하다.

toString()

  • 해당 메서드는 기본 데이터 유형에 대한 Wapper 클래스에서 정의된다.
  • 해당하는 데이터 유형만 처리하고 문자열 표현으로 직접 변환하는 특정된 메소드다.
  • 즉, 간단하고 명시적인 방법을 제공하여 명시적인 코드를 작성할 수 있다.

이정도로  요약할 수 있다.

이 둘의 가장 큰 차이점NPE(NullPointException)이다.

valueOf()의 경우 NPE가 발생하지 않지만, toString()NPE가 발생한다.

따라서 상황에 알맞게 사용할 필요가 있다는 것을 알게 되었다.

 

다른 풀이는 어떤 것이 있을지 찾아보았는데 정말 감탄이 나오는 풀이가 있었다.

import java.util.stream.IntStream;

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

 

chars() 메서드는 new StringBuilder().append(n).reverse() 를 통해 얻은 결과를 호출하고,

해당 결과 값을 정수 값으로 나타내는 IntStream을 반환해준다. 그리고 반환된 각 문자는 유니코드이다.

(여기서 chars() 메서드는 String, StringBuffer, StringBuilder과 같은 문자열 클래스에서만 사용할 수 있다.)

map(Character::getNumericValue)는 chars() 메서드를 통해 반환된 각각의 IntStream 값을 매핑하여 정수로 변환해준다.

마지막으로 toArray() 메서드를 통해 int[] 배열로 변환한다.

 

비전공자로서 기본기가 부족하기 때문에 알고리즘 공부에 대해 막연한 두려움이 있었다.

또한 문제 자체를 이해하지 못하는 경우가 많았지만,

모르는 개념들을 차근차근 찾아보고 기록하면서

흩어져있던 개념들을 다시 정립할 수 있어 재미를 느끼는 중이다.

앞으로도 꾸준히 매일매일 공부해보자!