<1.9> 숫자만 추출

mutexlocking·2022년 7월 9일
0

문제
: 문자와 숫자가 섞여있는 문자열이 입력으로 주어지면, 그중 숫자만 추출하여 , 추출한 순서대로 자연수를 만들어라
(추출하여 만들어진 자연수는 100,000,000을 넘지 않는다.)

EX) “tge0a1h205er” 이 입력되면 , 이중 '0', '1', '2', '0', '5' 만 추출하여 , 이를 순서대로 이어붙인 "01205"에 대한 자연수 1205 를 반환해야 함.

이 문제는 "입력한 문자열 중 숫자만을 순서대로 추출하여, 이들을 이어서 자연수를 만들어라" 라고 요구사항을 직관적으로 생각할 수 있는 문제이다.

요구사항이 분명한 만큼 , 이에 대한 해결 로직 또한 아래와 같이 바로 떠올릴 수 있었다.

  • 완성된 자연수가 100,000,000 값을 넘지 않는 다는 조건을 근거로 하여
    [100,000,000 , 10,000,000 , ... , 100 , 10, 1] 의 각 자리수 배열을 생성
  • 이후 자리수 배열의 자리수 값과, 위에서 추출한 각 숫자를 곱하여 자연수를 만들되 / 0 * 자연수 = 0 이 된다는 성질을 이용하여
    숫자를 추출하여 담을 배열도 미리 [0, 0, 0, 0, 0, 0, 0, 0, 0]으로 초기화 시켜놓고,

  • 전체 문자열을 역순으로 탐색하며 추출한 1의자리 숫자 부터 , 초기화 시킨 배열의 역순으로 대입함

  • 이후 각 자리수 배열과 , 추출한 숫자 배열을 element단위로 곱한 값을 누적하면 , 완성된 자연수가 된다.

이를 코드로 아래와 같이 구현하였다.

import java.util.Scanner;

public class Main {

    public static int solution(String str){

        //0. 결과를 담을 charNumArr와 intNumArr , sum 준비
        char[] charNumArr = {'0', '0', '0', '0', '0', '0', '0', '0', '0'};
        int[] intNumArr = {100000000, 10000000, 1000000, 100000, 10000, 1000, 100, 10, 1};
        int sum = 0;
        int idx = 8;
        
        //1. 문자열을 charAr() 을 써서 문자단위로 탐색하면서 , 숫자만 charNumArr에 넣기
        for(int i=str.length()-1; i>=0; i--){
            if(str.charAt(i)>=48 && str.charAt(i)<=57)
                charNumArr[idx--] = str.charAt(i);
        }

        
        //2, 이후 for문을 돌면서 결과값을 계산하여 result에 담안 후 반환
        for(int i=0; i<9; i++){
            sum += (charNumArr[i]-'0') * intNumArr[i];
        }

        return sum;
    }
    public static void main(String[] args){

        //0. Scanner 준비
        Scanner sc = new Scanner(System.in);

        //1. 문자열 입력
        String str = sc.next();

        //2. 입력받은 문자열을 인자로 넘기면서 solution()을 호출하여 , 결과값 자연수를 반환
        int result = solution(str);

        //3. 결과값 출력
        System.out.println(result);
    }
}

문제를 해결한 뒤, 나름 잘 풀었다고 생각하고 다른 사람의 코드를 봤는데,
replaceAll() 메서드를 이용해서 문자열 중 숫자만을 더 직관적으로 추출할 수 있음을 알게 되었다!

나또한 replaceAll() 메서드를 사용하여 좀더 직관적인 코드를 아래와 같이 작성해 보았고,
이번 경험을 통해 replaceAll() 메서드도 잊지 않고 잘 활용해야 겠다고 깨달았다.

import java.util.Scanner;

public class Main2 {

    public static int solution(String str){

        int num = 1;
        String result = str.replaceAll("[^0-9]", "");
        int sum = 0;

        for(int i = result.length()-1; i>=0; i--, num*=10){
            sum += num * (result.charAt(i) - '0');
        }

        return sum;
    }
    public static void main(String[] args) {

        Scanner sc = new Scanner(System.in);

        String str = sc.next();

        int result = solution(str);

        System.out.println(result);
    }
}

심지어 강의를 들으면서 String을 정수로 바꿔주는 Integer.parseInt() 메서드를 기억하게 되었고, 이를 이용하여 더욱 간편하게 정수화 할 수 있었다.

public static int solution(String str){

        String result = str.replaceAll("[^0-9]", "");
        return Integer.parseInt(result);
    }
profile
개발자가 되고자 try 하는중

0개의 댓글