숫자만 추출

Seungmin Lim·2022년 2월 5일
0

코딩문제연습

목록 보기
9/63

문제

나의풀이

import java.util.*;

class Main {
		    public String solution(String str) {
		    	String answer = "";
		    	
		    	//아스키 코드 '0' = 48 ~ '9' = 57
		    	int res = 0;
		    	for(char x : str.toCharArray()) {
		    		if(x >= 48 && x <= 57) res = res * 10 +(x-48);
		    	}
		    	answer = Integer.toString(res);
		    	
		    	//정규표현
		    	str = str.replaceAll("[^0-9]+", "");
		    	//맨 앞이 0일경우 처리
		    	while(str.charAt(0) == '0') {
		    		if(str.charAt(0) == '0')
		    			str = str.substring(1);
		    	}
		    	answer = str;
   	
		    	//isDigit()
		    	for(char x : str.toCharArray()) {
		    		if(Character.isDigit(x)) answer += x;
		    	}
		    	int n = Integer.parseInt(answer);//자동으로 0을 삭제
		    	answer = Integer.toString(n);
		    	return answer;
		    }
	
	public static void main(String[] args) {
		Main T = new Main();
		Scanner kb = new Scanner(System.in);
		String str = kb.next();
		System.out.println(T.solution(str));
	}
	
}

풀이방법

  1. 0~9의 아스키코드가 48~57인 점을 이용해서 만약 조건을 충족한다면
    res = res * 10 +(x-48); 을 통해 값을 저장해준다.
    예시) 0 2 0 8 을 받으면,
    1) res = 0 x 10 +(48-48) = 0
    2) res = 0 x 10 +(50-48) = 2
    3) res = 2 x 10 +(48-48) = 20
    4) res = 20 x 10 +(56-48) = 208

개인적으로 res = res * 10 + (x-48) 이런 규칙들을 떠올리는것을 연습해야겠다.

  1. 정규식을 이용해서 숫자가 아니라면? 전부 제외하고,
    만약 0208같이 0이 맨앞에 그것도
    여러번 나오게 되는 경우를 예외처리 해줘야한다.
    나는 while문을 통해 처리를 해주었는데,
    int를 return해도 되면 Integer.parseInt를 사용하면 자동으로 0이 사라진다.
  1. Character의 .isDigit()을 이용하면 해당 char가 digit인지 아닌지 판단이 된다.
    그 후는 2번과 동일!

핵심키워드

  • char는 원래 정수형 이기때문에 숫자로도 계산이 가능하다!
  • Integer.parseInt를 이용하면 문자열앞의 0을 빠르게 제거 할 수 있다.
  • "[^0-9]+" 를 이용하면 여러 숫자들을 거를 수 있다.
  • isDigit()을 이용하면 숫자인지 아닌지 판단할 수 있다.

0개의 댓글