문제
: 문자와 숫자가 섞여있는 문자열이 입력으로 주어지면, 그중 숫자만 추출하여 , 추출한 순서대로 자연수를 만들어라
(추출하여 만들어진 자연수는 100,000,000을 넘지 않는다.)EX) “tge0a1h205er” 이 입력되면 , 이중 '0', '1', '2', '0', '5' 만 추출하여 , 이를 순서대로 이어붙인 "01205"에 대한 자연수 1205 를 반환해야 함.
이 문제는 "입력한 문자열 중 숫자만을 순서대로 추출하여, 이들을 이어서 자연수를 만들어라" 라고 요구사항을 직관적으로 생각할 수 있는 문제이다.
요구사항이 분명한 만큼 , 이에 대한 해결 로직 또한 아래와 같이 바로 떠올릴 수 있었다.
- 완성된 자연수가 100,000,000 값을 넘지 않는 다는 조건을 근거로 하여
[100,000,000 , 10,000,000 , ... , 100 , 10, 1] 의 각 자리수 배열을 생성
이후 자리수 배열의 자리수 값과, 위에서 추출한 각 숫자를 곱하여 자연수를 만들되 / 0 * 자연수 = 0 이 된다는 성질을 이용하여
숫자를 추출하여 담을 배열도 미리 [0, 0, 0, 0, 0, 0, 0, 0, 0]으로 초기화 시켜놓고,전체 문자열을 역순으로 탐색하며 추출한 1의자리 숫자 부터 , 초기화 시킨 배열의 역순으로 대입함
이후 각 자리수 배열과 , 추출한 숫자 배열을 element단위로 곱한 값을 누적하면 , 완성된 자연수가 된다.
이를 코드로 아래와 같이 구현하였다.
import java.util.Scanner;
public class Main {
public static int solution(String str){
//0. 결과를 담을 charNumArr와 intNumArr , sum 준비
char[] charNumArr = {'0', '0', '0', '0', '0', '0', '0', '0', '0'};
int[] intNumArr = {100000000, 10000000, 1000000, 100000, 10000, 1000, 100, 10, 1};
int sum = 0;
int idx = 8;
//1. 문자열을 charAr() 을 써서 문자단위로 탐색하면서 , 숫자만 charNumArr에 넣기
for(int i=str.length()-1; i>=0; i--){
if(str.charAt(i)>=48 && str.charAt(i)<=57)
charNumArr[idx--] = str.charAt(i);
}
//2, 이후 for문을 돌면서 결과값을 계산하여 result에 담안 후 반환
for(int i=0; i<9; i++){
sum += (charNumArr[i]-'0') * intNumArr[i];
}
return sum;
}
public static void main(String[] args){
//0. Scanner 준비
Scanner sc = new Scanner(System.in);
//1. 문자열 입력
String str = sc.next();
//2. 입력받은 문자열을 인자로 넘기면서 solution()을 호출하여 , 결과값 자연수를 반환
int result = solution(str);
//3. 결과값 출력
System.out.println(result);
}
}
문제를 해결한 뒤, 나름 잘 풀었다고 생각하고 다른 사람의 코드를 봤는데,
replaceAll() 메서드를 이용해서 문자열 중 숫자만을 더 직관적으로 추출할 수 있음을 알게 되었다!
나또한 replaceAll() 메서드를 사용하여 좀더 직관적인 코드를 아래와 같이 작성해 보았고,
이번 경험을 통해 replaceAll() 메서드도 잊지 않고 잘 활용해야 겠다고 깨달았다.
import java.util.Scanner;
public class Main2 {
public static int solution(String str){
int num = 1;
String result = str.replaceAll("[^0-9]", "");
int sum = 0;
for(int i = result.length()-1; i>=0; i--, num*=10){
sum += num * (result.charAt(i) - '0');
}
return sum;
}
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
String str = sc.next();
int result = solution(str);
System.out.println(result);
}
}
심지어 강의를 들으면서 String을 정수로 바꿔주는 Integer.parseInt() 메서드를 기억하게 되었고, 이를 이용하여 더욱 간편하게 정수화 할 수 있었다.
public static int solution(String str){
String result = str.replaceAll("[^0-9]", "");
return Integer.parseInt(result);
}