✏️ 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://priming.tistory.com/19
https://colossus-java-practice.tistory.com/31
'IT > Algorithm | Coding Test' 카테고리의 다른 글
[프로그래머스 12941] [Java] 최솟값 만들기 (0) | 2025.02.25 |
---|---|
[프로그래머스 12951] [Java] JadenCase 문자열 만들기 (0) | 2025.02.25 |
[프로그래머스 181893] [Java] 배열 조각하기 (0) | 2025.01.17 |
[백준 1546] [Java] 평균구하기 (0) | 2025.01.15 |
[백준 11720] [Java] 숫자의 합 (0) | 2025.01.14 |