[인프런 알고리즘] (String) S01-09 문자열에서 숫자만 추출하기

김선호·2022년 7월 17일
0

알고리즘 / PS

목록 보기
3/4

문제

문자와 숫자가 섞여있는 문자열이 주어지면 해당 문자열에서 숫자만 추출하여 자연수로 나타낸다. 단, 이 때 숫자의 순서는 유지된다.


입출력

// 입력
g0en2T0s8eSoft

// 출력
208

문제 분석

  • 주어진 입력 예시에서 순서를 유지한 채 숫자만 추출하면 ‘0208’의 결과를 얻게 되는데, 출력 예시에서는 ‘208’로 표기되고 있다. 즉 문자열 타입이 아닌 정수형 타입으로 결과를 산출해야 출력 예시와 같은 결과를 얻을 수 있다.

풀이

풀이 1 : 정규표현식 이용

public int solution(String sentence) {
    sentence = sentence.replaceAll("[^0-9]", "");
    return Integer.parseInt(sentence);
}

첫 번째 풀이는 정규표현식을 이용한 풀이이다.

  • String.replaceAll(regex, replacement) 을 이용. regex로 [^0-9] 를 사용하여 주어진 문자열에서 숫자 0부터 9까지를 제외한 문자들을 모두 제거한다.
  • 리턴 시에는 Integer.parseInt() 를 이용하여 정수형으로 변환하여 리턴 한다.

풀이 2 : Character.isDigit() 이용

public int solution(String sentence) {
    StringBuilder sb = new StringBuilder();

    for (char c : sentence.toCharArray()) {
        if (Character.isDigit(c)) { // 현재 문자가 숫자인지 확인
            sb.append(c);
        }
    }

    return Integer.parseInt(sb.toString());
}

두 번째 풀이는 Character.isDigit(char) 를 이용한 풀이이다.

  • Character.isDigit(char) 는 주어진 인자 char가 숫자(Digit)이면 true를 리턴하고, 숫자가 아니라면 false를 리턴한다.
  • 숫자에 해당하는 문자만 정답 sb 에 추가하여 주고, 결과를 리턴한다.

풀이 3 : 아스키 코드 이용, 자릿값을 올려가며 답을 갱신하는 방법

public int solution(String sentence) {
    int answer = 0;

    for (char c : sentence.toCharArray()) {
        if (c >= 48 && c <= 57) { // 숫자 판별
            answer = (answer * 10) + (c - 48); // 자릿값 올리면서 갱신
        }
    }
    
    return answer;
}

세 번째 풀이는 아스키 코드를 이용한 풀이이다.

  • 아스키 코드로 ‘0’ 은 48, ‘9’ 는 57이다. 문자가 ‘0’~’9’ 사이에 해당하면 숫자로 판별하고, 기존의 answer(정답) 에 10을 곱해주어 자릿값을 올려준다(1의 자리 → 10의 자리, 10의 자리 → 100의 자리 … ).
  • 자릿값을 올려준 후 문자에서 ‘48’을 빼준 값을 더해주는데, 이는 문자 ‘0’의 실제 값은 48이기 때문에 48을 빼주어야 숫자 0이 되기 때문이다. 마찬가지로 문자가 ‘9’인 경우 실제 값은 57이기 때문에 48을 빼주어야 숫자 9가 되어 문자가 아닌 숫자로서 활용할 수 있다.

전체 코드

// 정규표현식 이용
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;

public class Main {
    public int solution(String sentence) {
        sentence = sentence.replaceAll("[^0-9]", "");
        return Integer.parseInt(sentence);
    }

    public static void main(String[] args) throws IOException {
        Main sol = new Main();

        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        String sentence = br.readLine();

        System.out.println(sol.solution(sentence));
    }
}

// Chracter.isDigit() 이용
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;

public class Main {
    public int solution(String sentence) {
        StringBuilder sb = new StringBuilder();

        for (char c : sentence.toCharArray()) {
            if (Character.isDigit(c)) { // 현재 문자가 숫자인지 확인
                sb.append(c);
            }
        }

        return Integer.parseInt(sb.toString());
    }

    public static void main(String[] args) throws IOException {
        Main sol = new Main();

        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        String sentence = br.readLine();

        System.out.println(sol.solution(sentence));
    }
}

// 아스키 코드를 이용. 자릿수를 올려가며 정답 갱신하는 풀이
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;

public class Main {
    public int solution(String sentence) {
        int answer = 0;

        for (char c : sentence.toCharArray()) {
            if (c >= 48 && c <= 57) {
                answer = (answer * 10) + (c - 48); // 자릿수 올리면서 갱신
            }
        }
        
        return answer;
    }

    public static void main(String[] args) throws IOException {
        Main sol = new Main();

        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        String sentence = br.readLine();

        System.out.println(sol.solution(sentence));
    }
}
profile
Every Run, Learn Counts.

0개의 댓글