알고리즘 및 자료구조

chapter. String (숫자만 추출)

지팡구 2022. 11. 30. 20:15

주어진 문제는 간단했다.

입력받은 문자열에 숫자가 있으면, 숫자만 추출해 순서대로 자연수를 만들어서 출력하는 문제였다.

// ex) g0en2T0s8eSoft -> 0, 2, 0, 8 == 208

 

이 문제를 어떻게 접근 할 것인가?에 대해 생각해보았고, 

// 나는 어떻게 접근할 것인가? -> 문자열 입력받고, 문자열의 길이만큼 반복을 통해 숫자와 문자를 필터->
// 그리고 숫자를 배열에 저장-> 배열 반환?  (그럼 숫자와 문자를 어떻게 필터할건데? -> '아스키코드' 이용)

이렇게 생각을 했다.


 

내가 앞서 생각한 방식 

int answer = 0;
for(int i =0; i<s.length(); i++){
    char a = s.charAt(i);
    if((int)a >57 || (int)a <47)
        // 이렇게 if문을 사용하지 않고도 isDigit()메소드 사용 가능함
        continue;
    else
        // 이 부분이 핵심이 될 듯? -> 기존에 생각 했던 부분은 그냥 문자를 계속 더해주는 것... -> (실패)
        answer = answer*10+((int)a-48);
}
return answer;

 

 

1) 간단하게 설명하자면 입력받은 문자열에 대해 길이만큼 반복문을 실행한다.

2) 문자을 하나하나 문자로 쪼갠다 (charAt) 사용

3) 이 쪼갠 문자를 아스키코드를 이용해 숫자인지 아닌지 조건문을 통해 확인한다.

(아스키코드로 숫자는 48~57[0-9]까지)

4) 이 문자가 숫자라면 계산식을 이용해 숫자를 더해준다


for문을 향상된 for문으로 바꿀 수 있다

for(char i : s.toCharArray()){
    .. 조건식
}

if문을 아래와 같이 바꾸고, 로직을 짤 수 있다.

바로 isdigit() 메소드를 사용하는 것이다. 

이 메소드는 입력값이 숫자인지 아닌지를 판별하는 메소드 (return 값이 True - False)이다.

 * isDigit()메소드로 if문을 교체할 수 있다*
 여기서 answer는 int가 아니라 String으로 와야한다. 
for(char x : s.toCharArray()){
    if(Character.isDigit(x)) answer+=x;
 }return Integer.answer;
 * * */