본문 바로가기
알고리즘/Java 코딩 테스트 준비

[Java] 문자와 숫자가 섞여있는 문자열 중 숫자만 추출해라

by Dev dreamer 2023. 1. 27.

 

 

입력 wwq02qweqew21e03 

 

출력 022103 이 아닌 22103 을 추출

 

💡 생각했던 것들.


 

얼마전에 replacAll을 배워서 금방 생각해 낼 수 있었다.

문자를 쭉 받고 만약 앞에 0이 있는 경우는 없어지게 해야 했는데

 

replaceAll 로 숫자 이외의 모든 값들을 없앤후에 정수로 치환하면 앞의 0 은 자연스럽게 없어질꺼라고 생각했다.

 

그런데 한참 고생했다.

 

그 이유는 

 

replaceAll 의 코드가 제 역할을 안해줬기 때문이다.

replaceAll("^0-9","") 이 코드가 작동을 안했다.

replaceAll("[^0-9]","") 이렇게 써줬어야 했다.

 

 

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;

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

	public static void main(String args[]) throws IOException {
		
		Main T = new Main();
		BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
		String str = br.readLine();
		System.out.println(T.solution(str));
		
	}

}

 

 

💡강사님 풀이


아스키 코드 "0~9" "A~Z" "a-z" 정도는 외워둬라 !!

 

0~9의 아스키코드 48~57

A~Z의 아스키코드 65~90

a~z의 아스키코드 97~122

 

48 65 97

숫자는 10개

알파벳은 35개 를 인지하면

 

48 65 97만 외우면 된다.

 

 

 

강사님 풀이 보면 엄청 기발하시고 매번 새롭다.

 

받은 문자열을 문자배열로 나열하고

그 각각의 문자 아스키코드의 값을 이용하는 것이다.

 

어차피 숫자만 필요하니까 아스키코드 48~57 사이의 값을 이용하면 되고

 

그 값중에서 처음 들어온 값을 받아서 아스키코드 48을 빼면 해당 숫자가 나온다(0부터 9까지이므로)

 

여기서 한번 값을 받고나면 그 다음에 숫자가 들어온다면 그전에 받은 값은 10의자리로 올라갈것이다

 

따라서 그전에 받은값*10 + (이번에 받은 문자열 아스키코드- 48) 을 통해서 계산하는 것이다.

 

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;

public class Main {
	
	public int solution(String str) {
		int answer=0;
		
		char[] a = str.toCharArray();
		
		for(char x: a) {
			if(48<=x&&x<=57) {
				answer=answer*10+(x-48);
			}
		}
		return answer;
	}
	public static void main(String args[]) throws IOException {
		
		Main T = new Main();
		
		BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
		
		String str = br.readLine();
		
		System.out.println(T.solution(str));
	}
	
}

 

 

 

 

💡강사님 풀이2


Character 라는 클래스에 isDigit(x) 이라는 메소드가 있는데

 

이게 참이면 숫자인 것이다.

 

이 함수를 이용해서 다음과 같이 할 수있다.

숫자인 경우에 answer이라는 문자열에 계속 추가시켜주고

맨 마지막 리턴할 때 int로 형변환만 해주면 동일하게 작동한다.

 

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;

public class Main {
	
	public int solution(String str) {
		String answer="";
		
		char[] a = str.toCharArray();
		
		for(char x : a) {
			
			if(Character.isDigit(x)) answer+=x;
			
		}
		
		return Integer.parseInt(answer);
	}
	public static void main(String args[]) throws IOException {
		
		Main T = new Main();
		
		BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
		
		String str = br.readLine();
		
		System.out.println(T.solution(str));
	}
	
}

 

 

 

 

 

코테 관련해서 많이 부담스러웠는데 강의를 통해 푸는 방법들을 배우니 이 시간이 즐겁습니다.

진짜 기능하나하나 다양한 방법으로 잘 가르쳐주십니다.

출처 : 자바(Java) 알고리즘 문제풀이 입문: 코딩테스트 대비 대시보드 - 인프런 | 강의 (inflearn.com)

댓글