IT/Algorithm | Coding Test

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

iamhyeon 2025. 1. 19. 12:42


✏️ 1번 방법

import java.util.Arrays;

public class 프로그래머스_자연수뒤집어배열로만들기 {
    
    class Solution {
        public int[] solution(long n) {
            String str = String.valueOf(n);
            int end = str.length();
            int[] answer = new int[end];            

            for(int i=0; i<end; i++) {
                answer[i] = Character.getNumericValue(str.charAt(end-i-1));
            }
            System.out.println(end);

            return answer;
        }
    }

    public static void main(String[] args) {
        Solution s = new 프로그래머스_자연수뒤집어배열로만들기().new Solution();

        System.out.println(Arrays.toString(s.solution(12345)));
    }

}

 

 

String.valueOf()

파라미터를 문자열로 형변환해주는 메서드

 

특징

1. null값에 대한 처리가 가능하다 

- 빈 값이 들어왔을 때 예외를 던지는 것이 아니라 "null" 문자열 반환해줌으로써 예상치 못한 NullPointer 에러를 사전에 예방할 수 있다

2. 숫자값에 대한 형변환이 자유롭다

- 1이라는 값을 "1"로 만들고 싶은 경우 (String)num으로 형변환 시도하면 ClassCastException 던지는 반면,

- String.valueOf()메서드는 의도대로 "1"을 반환한다

3. 기본객체에 대한 형변환이 가능하다

- Wrapper 클래스인 Integer, Boolean 과 같은 클래스 외에 기본객체인 int, double, boolean, char 등을 모두 문자열로 변환이 가능하다

 

toString()

- 문자열로 변환해주는 메서드

- Object에 선언된 메서드로 모든 클래스는 toString을 가질 수 있다

- String클래스에도 toString이 있고, Integer, Long, Float, Double 에도 toString이 있다

 

toString()   |   String.valueOf()

- Object값을 String으로 형 변환해준다

- 변경하고자 하는 Object가 null인 경우 다르다

- toString()  :  대상 값이 null이면 Null PointerException (NPE) 를 발생시키고, Object에 담긴 값이 String이 아니어도 출력한다.

- valueOf  :  파라미터가 null이면 문자열 "null" 반환

 

String.valueOf(Object obj) 구현체는 삼항연산자를 통해

인자가 null이면 null 리턴

아니면 obj.toString() 메서드를 호출한다.

 


 

charAt()

2024.09.26 - [IT/JAVA] - Java API - Lang package java.lang

 

Java API - Lang package java.lang

- 자바 프로그래머에게 제공되는 기본 기능의 모음 - 패키지 단위로 구성되어 있으며 라이브러리 형태로 압축되어 JAVA언어에 내장되어 있다. - 자바 언어를 구성하는데 필요한 가장 필수적이고

iamsh.tistory.com

더보기

- 일반 사용자가 데이터를 입력한다 가정하면 문자 닥 하나만 입력하는 경우는 드물 것이다.

- 단어나 문장을 입력하는 경우가 훨씬 많을 것이기 대문에 한 글자만 입력할 수 있는 기능을 넣기 보다는 문자열로 입력받는 것이 효율적일 것이다.

- Scanner로 입력 받을 땐 String 타입으로 밖에 받을 수 없어 charAt이 있다.

- String으로 저장된 문자열 중에서 한 글자만 선택해서 char타입으로 변환해준다.

문자열.charAt(인덱스)

- 문자열의 인덱스번째에 있는 문자를 char타입으로 변환한다.

 

 

java.lang.Character.getNumericValue(char)

숫자 형태의 char형을 int형으로 변환

그렇지 않으면 -1 반환

 


 

✏️ 2번 방법

 

import java.util.Arrays;

public class PG12932_자연수뒤집어배열로만들기 {
    
    public int[] solution(long n) {

        char[] c = String.valueOf(n).toCharArray();      
        int size = c.length;

        for(int i=0; i<size/2; i++) {
            int end = size-i-1;

            char temp = c[i];
            c[i] = c[end];
            c[end] = temp;
        }

        int[] answer = new int[size];
        for (int i=0; i<size; i++) {
            answer[i] = c[i]-'0';
        }
        return answer;
    }

    public static void main(String[] args) {
        PG12932_자연수뒤집어배열로만들기 ex = new PG12932_자연수뒤집어배열로만들기();
        System.out.println(Arrays.toString(ex.solution(12345)));
        System.out.println(Arrays.toString(ex.solution(123456)));
    }
}

 

// 1)
answer[i] = c[i]-'0';
// 2)
answer[i] = Character.getNumericValue(c[i]);

⬆️ char값을 int값으로 변환하는 역할

 

answer[i] = c[i]-'0';

- c[i]의 유니코드 값에서 문자'0'의 유니코드 값을 빼서 숫자로 변환한다.

- 문자'5'의 유니코드 값은 53이고, 문자'0'의 유니코드 값은 48이므로   '5'-'0' = 53-48 = 5

- 간단하고 빠르다. 숫자 문자 ('0'~'9')에 대해서만 동작한다.

 

answer[i] = Character.getNumericValue(c[i]);

- 주어진 문자를 숫자로 변환한다. 

- 숫자 형태의 문자뿐만 아니라 유니코드 숫자도 변환할 수 있다.

- 문자'5'는 5로 변환되고,  유니코드 숫자 'Ⅳ'는 4로 변환된다.

- 약간 더 복잡하고, 성능이 ① 보다 약간 떨어질 수 있다. ⬇️

더보기

Character.getNumericValue(char)

입력 문자가 숫자 문자인지, 유니코드 숫자인지 등을 확인하고, 해당하는 숫자 값을 반환하는 복잡한 로직을 포함하고 있다.

다양한 입력을 처리하기 위해 여러 조건문과 분기문을 사용한다.

단순히 문자 '0'의 유니코드 값을 빼는 연산보다 더 많은 연산을 필요로 한다.

 

📝

 

일반적인 경우  :  answer[i] = c[i] - '0';이 더 나은 선택

간단하고 빠르며, 숫자 문자('0' ~ '9')에 대해서만 동작하기 때문에 대부분의 경우에 적합하다


특수한 경우  :  유니코드 숫자와 같은 특수한 문자를 처리해야 하는 경우에는 answer[i] = Character.getNumericValue(c[i]);을 사용하는 것이 더 적합하다


✏️ 3번 방법

 

import java.util.Arrays;

public class PG12932_자연수뒤집어배열로만들기 {
    
    public int[] solution(long n) {

        String str = new StringBuilder(String.valueOf(n)).reverse().toString();
        return str.chars().map(c -> c-'0').toArray();
    }

    public static void main(String[] args) {
        PG12932_자연수뒤집어배열로만들기 ex = new PG12932_자연수뒤집어배열로만들기();
        System.out.println(Arrays.toString(ex.solution(12345)));
        System.out.println(Arrays.toString(ex.solution(123456)));
    }
}

 

new StringBuilder(String.valueOf(n))
문자열을 StringBuilder 객체로 변환한다.
StringBuilder는 문자열을 조작할 수 있는 가변 시퀀스를 제공한다.

2025.01.19 - [IT/JAVA] - StringBuilder

 

.reverse()
StringBuilder 객체의 문자열을 뒤집는다

 

문자열.chars()
문자열의 각 문자를 IntStream으로 변환한다.

 

.map(c -> c - '0')
IntStream의 각 요소를 매핑하여 새로운 값을 생성한다.

 

.toArray()
IntStream을 배열로 변환한다.

 


 

1번방법

- 코드가 간결하고 이해하기 쉽다.

- 문자열의 각 문자를 뒤집어서 접근하는 과정에서 charAt 메서드를 반복적으로 호출하므로, 성능이 약간 떨어질 수 있다.

 

2번방법  

- 문자열을 한 번만 순회하여 뒤집기 때문에, 성능이 더 좋을 수 있다.
- 문자열을 뒤집는 과정에서 불필요한 메서드 호출이 없다.
- 코드가 더 길고 복잡합니다.
- 1번 방법에 비해 코드가 덜 직관적이다.

- 성능이 중요한 경우에 적합하다.

 

3번방법 

- 코드가 매우 간결하고 이해하기 쉽다.
- 문자열을 뒤집고 각 문자를 숫자로 변환하는 과정이 직관적이다.
- Java 스트림 API를 사용하여 코드가 간결하고 함수형 프로그래밍 스타일을 따른다.
- 문자열을 뒤집고 스트림을 사용하는 과정에서 약간의 성능 저하가 있을 수 있다. 특히, 큰 숫자를 처리할 때 성능이 떨어질 수 있다.

- 일반적인 경우에 충분히 성능이 좋다. 코드의 가독성과 유지보수성을 중시하는 경우에 적합하다.

 

 

 

 

 

 

 


refer to

메가스터디아이티 이광호쌤

https://swjeong.tistory.com/146

https://velog.io/@hana0627/String.valueOf%EB%A5%BC%EC%82%AC%EC%9A%A9%ED%95%B4%EC%95%BC%ED%95%98%EB%8A%94%EC%9D%B4%EC%9C%A0

https://priming.tistory.com/19

https://colossus-java-practice.tistory.com/31

 

 

 

 

 

반응형