일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | ||||||
2 | 3 | 4 | 5 | 6 | 7 | 8 |
9 | 10 | 11 | 12 | 13 | 14 | 15 |
16 | 17 | 18 | 19 | 20 | 21 | 22 |
23 | 24 | 25 | 26 | 27 | 28 | 29 |
30 |
- super 생성자
- 개발자
- 백앤드
- 독학
- 알고리즘
- 개발
- 클래스의구조
- 부모 생성자
- 예외던지기
- AoutoBoxing
- 자바
- 예외처리
- 코딩
- Calendar Class
- 비전공자
- 국비지원
- 가위바위보프로그램
- 생성자
- Date Class
- 프로그래머스
- 추상화
- do~while문
- userDefineException
- 취준생
- exception
- 상속
- Java
- 캐스팅연산자
- 사용자 정의 예외처리
- for문
- Today
- Total
유난스런 개발 기록
[JAVA] 프로그래머스 - 자연수 뒤집어 배열로 만들기 본문
문제 설명
자연수 n을 뒤집어 각 자리 숫자를 원소로 가지는 배열 형태로 리턴해해주세요.
예를들어 n이 12345이면 [5,4,3,2,1]을 리턴합니다.
제한 조건
- n은 10,000,000,000이하인 자연수입니다.
입출력 예
n | return |
12345 | [5,4,3,2,1] |
나의 풀이 과정
- 입력한 숫자를 문자열로 변환해준다.
- 변환 되어진 문자열을 역순이 되도록 뒤집어준다.
- 뒤집힌 문자열을 문자형태의 배열로 변환해준다.
- 변환 되어진 배열의 문자를 숫자로 바꿔준다.
나의 코드
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[] 배열로 변환한다.
비전공자로서 기본기가 부족하기 때문에 알고리즘 공부에 대해 막연한 두려움이 있었다.
또한 문제 자체를 이해하지 못하는 경우가 많았지만,
모르는 개념들을 차근차근 찾아보고 기록하면서
흩어져있던 개념들을 다시 정립할 수 있어 재미를 느끼는 중이다.
앞으로도 꾸준히 매일매일 공부해보자!
'알고리즘' 카테고리의 다른 글
[JAVA] 프로그래머스 - 최빈값 구하기 (0) | 2023.10.03 |
---|---|
[JAVA] 프로그래머스 - 짝수는 싫어요 (0) | 2023.10.03 |