알고리즘 풀이 방법입니다.
문제(Problem) -> 생각(Think) -> 해결책(Solution) -> 리뷰(Review) 를 통해서 정리해서 작성합니다.
Problem📄

https://programmers.co.kr/learn/courses/30/lessons/12932

 

코딩테스트 연습 - 자연수 뒤집어 배열로 만들기

자연수 n을 뒤집어 각 자리 숫자를 원소로 가지는 배열 형태로 리턴해주세요. 예를들어 n이 12345이면 [5,4,3,2,1]을 리턴합니다. 제한 조건 n은 10,000,000,000이하인 자연수입니다. 입출력 예 n return 12345

programmers.co.kr


Think🤔

12345를 넣으면 그대로 뒤집어서 마지막 부터 넣어주는 것

Long 값으로 n을 받는다

그럼 이것을 스트링으로 바꿔서 뒤집은 다음 다시 long형태로 바꿔줄 수 있다.

 

split로 쪼개서 String배열을 만들어서 넣어줄 수 있다.

 

long의 값을 이용해서 일의 자리를(제일 오른쪽값) 바로 int[]에 넣을 수 있다.


Solution✍
import java.util.Arrays;

class Solution {
    public int[] solution(long n) {
        String tmp = Long.toString(n);
        
        int[] answer = new int[tmp.length()];
        
        int count=0;
        for(int i=tmp.length()-1; i>=0; i--){
            answer[count] = Character.getNumericValue(tmp.charAt(i));
            count++;
        }
        
        return answer;
    }
}

1. 롱 타입의 n을 String 타입으로 바꿔준다.

2. 반환하기 위한 answer을 tmp의 글자수와 똑같이 만든다.

3. 마지막에 있는 charAt을 int형으로 바꾼다.

 

Character.getNumericValue(tmp.charAt(i));

- 숫자형태의 char을 int형으로 반환 시키는 메서드이다.

 

import java.util.Arrays;
import java.util.Collections;

class Solution {
    public int[] solution(long n) {
        String s = String.valueOf(n);
        StringBuilder sb = new StringBuilder(s);
        
        // sb 거꾸로
        // sb = sb.reverse();
        sb.reverse();
        
        int[] answer = new int[sb.length()];
        
        String[] sbStr = sb.toString().split("");
        
        for(int i=0; i<sb.length(); i++){
            answer[i] = Integer.parseInt(sbStr[i]);
        }
        
        
        return answer;
    }
}

1. s(String) 에 n(문자열로 치환)을 넣는다.

2. StringBuilder(싱글 스레드에 사용 지금 메인 하나이니 싱글 스레드임) 객체 생성

3. reverse() 메소드를 이용해 sb문자열 거꾸로

4. 정수 배열 answer 생성 sb 글자수 만큼

5. sbStr(String[]) sb를 쪼개서 배열에 넣어줌

6. 쪼갠 String값 int형으로 바꿔서 answer에 담아서 넣어줌

 

String[] split(String regex)

- split 함수는 입력받은 정규 표현식 또는 특정 문자를 기준으로 문자열을 나누어 배열(Array)에 저장 하는 것

 

전화번호 예제

String str = "010-1234-5678";
String[] phone = str.split("-");

하면 String phone에는 ["010","1234","5678"] 이 들어가게 된다.

 

class Solution {
    public int[] solution(long n) {
        String tmp = n+"";
        
        int[] answer = new int[tmp.length()];
        
        int count = 0;
        while(n > 0){
            answer[count] = (int)(n % 10);
            n = n / 10;
            count++;
        }
        
        return answer;
    }
}

1. 문자열 추가로 String형으로 변환

2. answer 배열 길이 String 길이

3. while문을 이용해 나머지 값 넣어주기

4. 10으로 나누면서 끝 자릿수 출력

 

(int)n % 10

을 헀는데 실패가 한 3개 나왔던 것 같다.

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

라는 조건 때문에 아마도 n의 값이 int형 범위에서 벗어난 것 아닐까? 근데 10으로 나누면 제일 큰값이 들어와도 나뉘면 값이 맞게 들어간다.

반례를 찾아야 증명이 가능하다.

먼저 (int)n이 시작되면 10,000,000,000 값이 들어와있을때 int 범위인 2,147,483,647이 되어버리고 거기서 % 10을 하기 때문에 값이 다르게 나온다.!!


Review🤩

다양한 방법으로 풀어보았고, int 와 long의 차이점 값의 범위에 대해서 알게 되었고,

StringBuilder에 대해서 다시 복습했다.

그리고 몰랐던 숫자형태의 char를 int형으로 반환 시키는 메서드도 알게 되었고, 또 split에 대해서 복습했다.


+ Recent posts