코딩테스트

[문자열] 9. 숫자만 추출

개발하는지호 2023. 12. 3. 13:42
9. 숫자만 추출
 

설명

문자와 숫자가 섞여있는 문자열이 주어지면 그 중 숫자만 추출하여 그 순서대로 자연수를 만듭니다.

만약 “tge0a1h205er”에서 숫자만 추출하면 0, 1, 2, 0, 5이고 이것을 자연수를 만들면 1205이 됩니다.

추출하여 만들어지는 자연수는 100,000,000을 넘지 않습니다.

입력

첫 줄에 숫자가 섞인 문자열이 주어집니다. 문자열의 길이는 100을 넘지 않습니다.

출력

첫 줄에 자연수를 출력합니다.

예시 입력 1 

g0en2T0s8eSoft

예시 출력 1

208

 

<<풀이>>

 

우선, 이 문제는 8번 문제로 인해서 정규식 표현으로 풀었다. 하지만 다양한 풀이법이 있었다 ㅋㅎ 

 

첫 번째, 정규식 표현 (내가 푼 방식이다)

import java.util.Scanner;

class Main {
    public int solution(String str) {
        String a = str.replaceAll("[^0-9]", "");
        int answer = Integer.parseInt(a);

        return answer;
    }

    public static void main(String[] args) {
        Main T = new Main();
        Scanner in = new Scanner(System.in);
        String str = in.next();
        System.out.println(T.solution(str));

    }
}

 

이렇게 풀 수 있다.

이때 Integer.parseInt()로 문자열을 숫자로 바꿔주는 방법을 이용하면 손쉽게 풀 수 있다.

 

두 번째

아스키코드에 대해 정확히 파악하고 있으면 아스키코드를 활용해서 구할 수 도 있다.

import java.util.Scanner;

class Main {
    public int solution(String str) {
       int answer = 0;
       for (char x : str.toCharArray()) {
           if (x >= 48 && x <= 57) answer = answer * 10 + (x - 48);
       }
       return answer;
    }

    public static void main(String[] args) {
        Main T = new Main();
        Scanner in = new Scanner(System.in);
        String str = in.next();
        System.out.println(T.solution(str));

    }
}

 

'0' 부터 '9'라는 문자는 아스키 코드로 48 ~ 57를 의미한다. 이를 활용해서 구하는데, 이 때 놀라운 점은

바로  answer = answer * 10 + (x - 48) 이런식으로 숫자를 만들어 나간다는 점이다.

물론 당연한 연산 방식일 수도 있으나, 이러한 생각은 어쨌든 나에게 센세이션이다 ㅎㅎ.. 

아스키코드는 연산을 하는 순간 정수로 바뀐다는 것을 인지하자. 

 

ex) int a = 'A' + 'B' ==> a는 131이 된다.

 

세 번째 방법은 isDigit()이라는 메소드를 활용한다. Character의 메소드이다.

 

import java.util.Scanner;

class Main {
    public int solution(String str) {
      String answer = "";
      for (char x : str.toCharArray()) {
          if (Character.isDigit(x)) answer += x;
      }
      return Integer.parseInt(answer);
    }

    public static void main(String[] args) {
        Main T = new Main();
        Scanner in = new Scanner(System.in);
        String str = in.next();
        System.out.println(T.solution(str));

    }
}

 

 

한 문제에 여러가지 풀이 방식이 있다. 즉, 정답은 딱 정해진건 없다는 것이다. 상황에 맞게 메모리 등을 고려하여 최적의 방식을 사용하면 된다. 그렇게 하기 위해서는 여러가지 방식을 인지하고  숙달해놓는 것이 좋다.