PS(Java)/인프런 강의 문제

[PS] 인프런 강의 - 문자열 9. 숫자만 추출

UL :) 2022. 10. 11. 19:15

 

문제

문자와 숫자가 섞여있는 문자열이 주어지면 그 중 숫자만 추출하여 그 순서대로 자연수를 만듭니다.
만약 “tge0a1h205er”에서 숫자만 추출하면 0, 1, 2, 0, 5이고 이것을 자연수를 만들면 1205이 됩니다.
추출하여 만들어지는 자연수는 100,000,000을 넘지 않습니다.

 

▣ 입력설명
첫 줄에 숫자가 썩인 문자열이 주어집니다. 문자열의 길이는 100을 넘지 않습니다.

 

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

 

▣ 입력예제 1
g0en2T0s8eSoft

 

▣ 출력예제 1
208

 

풀이

1) 아스키 코드로 푸는 방법

answer = answer * 10 + (숫자 - 48) 

 

위 식을 사용하여 풀면 된다. (* 0의 아스키코드 : 48,   9의 아스키코드: 57)

 

문자로 연산을 하게 되면 아스키코드로 바뀌어서 계산되기 때문에 (예: 0은 48로 바뀌어 계산됨)

꼭 0의 아스키 코드인 48을 빼준다.

 

0,  x=48: 0 = 0 x 10 + 0

1,  x=49: 1 = 0 x 10 + 1

2,  x=50: 12= 1 x 10 + 2 

0,  x=48: 120 = 12 x 10 + 0

5,  x=53: 1205 = 120 x 10 + 5

 

2) Character.isDigit(), Integer.parseInt() 사용

isDigit() 함수로 숫자이면 문자열에 붙이고, 

Integer.parseInt() 함수를 사용해서 int로 바꾸면 된다.

0208 처럼 앞에 0이 있어도 208로 변경되므로 아주 간단하게 풀 수 있다.

 

코드

1) 아스키 코드로 푸는 방법

import java.util.Scanner;

public class Main {
 
	public static void main(String[] args) {
		Scanner in = new Scanner(System.in);

		String s = in.next();
		int answer = 0;
		
		for(char c : s.toCharArray()) {
			if(c >= 48 && c <= 57) answer = answer * 10 + (c - 48);
		}
		
		System.out.print(answer);
		
	}
}

 

2) 추천! Character.isDitigt(), Integer.parseInt() 사용

import java.util.Scanner;

public class Main {
 
	public static void main(String[] args) {
		Scanner in = new Scanner(System.in);

		String s = in.next();
		String answer = "";
		
		for(char c : s.toCharArray()) {
			if(Character.isDigit(c)) answer += c; //숫자면 문자열에 붙인다
		}
		
		System.out.print(Integer.parseInt(answer)); //int로 변경
		
	}
}