주니어 기초 코딩공부/JAVA_programmers_코딩테스트

자연수 뒤집어 배열로 만들기_programmers_lev01_str.charAt()

jju_developer 2023. 7. 1. 12:47
728x90

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

<제한 사항>
n은 10,000,000,000이하인 자연수입니다.

 

<해결 과정>

처음에는 배열을 두개 사용하여 이중 for 문을 이용하려고 했었습니다.

예를 들면

class Solution {
    public int[] solution(long n) {

 

이렇게 있을 때 n 의 값이 12345로 들어오면 그 값을 나누어 배열에 저장하고

answer배열을 생성한 후 이중 for문으로 n 값의 배열은 뒤에서부터 가져오고 그 값을
answer의 0번째부터 넣게 하여 뒤집으려고 하였습니다.

하지만 해당 방법은 너무 효율성이 떨어진다는 판단에 생각을 바꿨습니다.

 

 들어오는 수의 값을 문자열로 바꾸고 해당 값의 길이를 구하여 answer 배열을 생성하였습니다.

그 후 for문을 사용하여 아스키값을 문자 '0'을 뺀 값을 answer의 0번째 부터 넣게 하였습니다.

자세한 설명은 아래 노트 설명 봐주세요 ^^

<나의 코드>

class Solution {
    public int[] solution(long n) {
        
        //1. 배열의 길이를 구하기 위해 문자로 변환 ex) n=12345 일때 4개의 배열 필요
        String str = String.valueOf(n);
        int[] answer = new int[str.length()];
        System.out.println(str.length());
        //for문을 이용해서 뒤에서부터 시작하여 처음까지 반복
        for(int i=str.length()-1;i>=0;i--){
            answer[str.length()-1-i] = str.charAt(i)-'0';
        } 
        return answer;
    }
}

 

<느낀 점>

다른 사람의 코드를 보면 StringBuilder를 사용하여 문제를 푼 부분이 있어 장점을 정리해 보았습니다.

class Solution {
  public int[] solution(long n) {
      String s = String.valueOf(n);
      StringBuilder sb = new StringBuilder(s);
      sb = sb.reverse();
      String[] ss = sb.toString().split("");

      int[] answer = new int[ss.length];
      for (int i=0; i<ss.length; i++) {
          answer[i] = Integer.parseInt(ss[i]);
      }
      return answer;
  }
}

StringBuilder는 문자열을 조작할 때 사용되는 클래스로, 문자열을 효율적으로 처리하기 좋다고 합니다.
1. 가변성: StringBuilder는 가변성이 장점입니다.

즉, 기존 문자열에 추가하거나 삭제할 수 있습니다. 이는 문자열을 다룰 때 메모리의 효율성을 높이고 성능을 향상할 수 있습니다.

2. 성능: StringBuilder는 내부적으로 가변 크기 버퍼를 사용하여 문자열 조작을 수행합니다.

이는 문자열을 반복적으로 조작해야 할 때 많은 메모리 복사를 피하고 성능을 향상시킬 수 있습니다.

따라서 문자열 연결, 삽입, 삭제 등의 작업에서 StringBuilder를 사용하는 것이 좋다고 합니다.

3. 스레드 안정성: StringBuilder는 단일 스레드 환경에서 안전하게 사용할 수 있습니다.

여러 스레드가 동시에 StringBuilder를 조작하는 경우 동기화를 직접 처리해주어야 하기 때문에 멀티스레드 환경에서는 StringBuilder 대신 StringBuffer를 사용하는 것이 안전한 것 같습니다.

4. 메서드 체이닝: StringBuilder는 메서드 체이닝을 지원하여 여러 작업을 연속적으로 수행할 수 있다는 부분이 가장 인상 깊었습니다.

이는 코드의 가독성을 높이고 작업을 간결하게 표현할 수 있다고 합니다.

따라서 StringBuilder를 사용하면 문자열 조작에 효율적이고 성능이 좋으며 코드의 가독성을 높일 수 있기 때문에

다음번 문자열을 사용할 때에 StringBuilder를 이용하면 좋을 것 같습니다.

 

오늘도 수고하셨습니다 😄

728x90