본문 바로가기
Algorithm

[Java&알고리즘] 자연수 뒤집어 배열로 만들기 (Level 1)

by GoodDayDeveloper 2023. 2. 21.
반응형

 

프로그래머스의 알고리즘 문제 및 풀이에 대해 차근차근 포스팅하려합니다.

 

저도 초보자이기도하고 알고리즘에 쉽게 다가갈 수 없는 부분들이 많기 때문에

최대한 알기 쉽게 정리해보려하고 알고리즘을 어려워하는 분들에게 도움이 되었으면 합니다.

 

많이 공유되고 토론이 될 수 있는 공간이 되었으면 좋겠습니다.

 

 

 

 

 

 

 

환경

언어 : 자바

단계 : 레벨 1단계 (입문자용)

정답률 : 86%

 

 

 

 

 

제목 

 

자연수 뒤집어 배열로 만들기

 
 
 

 

 

문제 설명 및 코드

 

 

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

 

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

 

 

 

1
2
3
4
5
6
7
8
9
10
11
12
import java.util.*;
 
public class Solution {
    public int[] solution(int n) {
        int[] answer = {};
 
        return answer;
    }
}
cs

 

 

 

 

 

입출력 예

 

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

 

 

 

 

 

 
반응형

 

 

 

 

 

 

 

문제 정답 코드

 

 

 

1
2
3
4
5
6
7
8
9
10
11
12
class Solution {
    public int[] solution(long n) {
        
        String arrStr = Long.toString(n);
        int[] answer = new int[arrStr.length()];
 
        for(int i=arrStr.length() - 1; i>=0; i--){
            answer[arrStr.length()-1-i] = arrStr.charAt(i) - '0';
        }      
        return answer;
    }
}
cs

 

 

 

우선 임의의 수인 n를 문자열로 변환해줍니다.

그리고 반환변수인 answer에 배열 초기화를 선언해줍니다.

 

그 후에 문자열 길이만큼 반복을 하는데

중요한 포인트는 뒤집어서 반복을 해주는 겁니다.

 

값이 1,2,3,4,5로 되어있는 길이의 -1 만큼 i값에 넣어준 다음,

i를 하나씩 빼주면서(i--)  0까지 반복을 해줍니다. (i>=0) 

 

그리고 반환배열변수인 answer에는 순차적으로 값이 쌓일 수 있도록

arrStr.length()-1-i를 해줍니다.

뒤집어서 반복이 되지만 answer의 대괄호( [ ] ) 안에는  

결국 0,1,2,3,4  순서로 인덱스가 들어가게 될 겁니다.

 

순서대로 설정한 answer에 charAt를 사용하여 값을 넣어주기만 하면 됩니다.

 

 

 


 

 

여기서 charAt는 String타입으로 받은 문자열을 char타입으로 한 글자씩 받는 함수입니다.

예를 들어 n의 값이 '123' 이라고 했을 경우

charAt(0)을 했을때의 값은 1이 됩니다.

 

하지만 우리는 이것을 차례차례 더한 값을 원하기 때문에

숫자인 int형으로 변환을 해줘야하는 겁니다.

즉, nStr.charAt(0)은 문자열 '1'이 출력되고 이걸 int형으로 변환시키면 아스키코드값인 49가 나오게 됩니다.

 

하지만 우리는 1이 필요하기 때문에 48을 빼줘야하는데

'0'은 아스키코드 48입니다.

그래서 - '0'을 사용하여 반복하면 차례차례 더한 값이 변수에 저장이 되는 겁니다.

 

 

 

 

 

 

 

 

 

다른사람 풀이

 

 

1
2
3
4
5
6
7
import java.util.stream.IntStream;
 
class Solution {
    public int[] solution(long n) {
        return new StringBuilder().append(n).reverse().chars().map(Character::getNumericValue).toArray();
    }
}
cs

 

 

단 한줄에 푸는 코드를 발견했습니다..

하나하나 해석해보자면

 

StringBuilder는 String과 문자열을 더할 때 새로운 객체를 생성하는 것이 아니라 기존의 데이터에 더하는 방식을 사용하기 때문에 속도도 빠르며 상대적으로 부하가 적습니다.

 

append는 n를 넣어주고

 

reverse는 뜻 그대로 문자열을 뒤집는 역활을 합니다.

 

chars는 char 타입으로 변경해준 다음

 

map(Character::getNumericValue)은 숫자형태의 char형을 int로 변환해주어

 

toArray는 list형태의 값을 배열로 형변환 시켜주는 역활을 합니다.

 

 

 

여러 연산 코드가 아닌 함수로 해결할 수도 있다는게 신기하네요!

 

 

 

 

 

반응형

댓글