띠오니 개발자 성장일지
article thumbnail
반응형

인프런의 "자바(Java) 알고리즘 문제풀이 : 코딩테스트 대비" 강좌를 수강했습니다.

0.1.  


1.  

2. Q1-09. 숫자만 추출

숫자와 문자가 섞인 문자열 입력 시 숫자만 추출해 자연수로 출력한다.
g0en2T0s8eSoft 이 입력되면 0,2,0,8을 추출하고 208이 출력된다.

2.1.  

2.2.  

2.3. ✏️ 내가 쓴 답

이 앞전에 푼 문제에서 쓴 replaceAll() 을 이번 문제에서도 사용했다.

이전 문제는 알파벳을 제외한 문자를 지우는 반면, 이번 문제는 알파벳을 지우고 숫자만 남기고 싶었기 때문에 아래와 같이 작성했다.

예를 들어 추출된 문자열이 "0208" 이라 했을 때, 문자열을 숫자로 변경하기 위해서 Integer.parseInt()를 사용한다. 자연수로 변경되기 때문에 맨 앞의 0은 자동으로 없어진다.

<java />
import java.util.Scanner; public class Main { public int solution(String str){ int answer = 0; str = str.toLowerCase().replaceAll("[a-z]", ""); answer = Integer.parseInt(str); return answer; } public static void main(String[] args) { Main main = new Main(); Scanner sc = new Scanner(System.in); System.out.println( main.solution(sc.nextLine())); } }

 

2.4. 👨🏻‍🏫 풀이 코드

선생님이 풀어주신 코드는 아래와 같다.

2.4.1. 첫 번째 방법

숫자는 ASCII Code48(0)~57(9) 로 표현될 수 있다. 각 문자(char c)가 해당 범위에 속한다면 숫자이다.

answer = answer * 10 + (x-48) 이 공식이 처음에 무슨 말인지 몰랐다.  0238로 예를 들면

  1. 첫 번째 경우 answer = 0 (초기값), c의 ASCII Code = 48(0) ➡️ answer =  0 * 10  + (48-48) (answer = 0)
  2. 두 번째 경우 answer = 0, c의 ASCII Code = 50(2) ➡️ answer = 0 * 10 + (50-48) (answer = 2)
  3. 세 번째 경우 answer = 2, c의 ASCII Code = 51(3) ➡️  answer = 2 * 10 + (51-48) (answer = 23)
  4. 네 번째 경우 answer = 8, c의 ASCII Code = 56(8) ➡️  answer = 23*10 + (56-48) (answer = 238)

즉 결과 answer 값은 238이 되는 것이다. 문자열로 된 숫자를 십진수 숫자로 바꾸는 과정의 식인듯 하다. 10을 곱하는 건 자릿수가 결정이 되는 것이고, (c-48)은 48(0)을 기준으로 c와의 차를 구해 어떤 숫자인지 알아내는 부분이다.

무슨 말인가 했는데 하나하나 풀어보니 어렵지 않은 과정이었다. 근데 시험칠때 이런 과정 생각해낼 수 있을까? ㅠㅠ((쭈굴

<java />
public int solution(String str) { int answer = 0; for(char c : str.toCharArray()) { if( c>=48 && c<=57 ) answer = answer*10 + (c-48); } return answer; }

2.4.2.  

 

반응형

2.4.3.  

2.4.4. 두 번째 방법

Character 객체isDigit() 메소드를 사용하는 방법이다.

Java 11 공식문서 에서 자세한 내용을 확인할 수 있다. 해당 문자가 숫자인지 아닌지 판단하는 메소드이다.

자연수로 답을 반환해야 하므로 Integer.parseInt로 문자열 answer 을 숫자로 바꿔 반환해준다.

이 강의 과정에서만 그런건지 모르겠는데 Character 객체를 자주 사용하는 것 같다. 실제 코테에서도 사용되는지는 차차 기출문제를 풀어보면 알 수 있겠지! 🤓

<java />
public int solution(String str) { String answer = ""; String tmp = ""; for(char c : str.toCharArray()){ if(Character.isDigit(c)) answer += c; } return Integer.parseInt(answer); }

 

 

3. 🤓 정리

  • 숫자 0~9까지의 ASCII Code 범위는 48(0)~57(9) 
  • 복습! 대문자는 65(A)~90(Z), 소문자는 97(a)~122(z) 
  • Character.isDigit(char c) 문자가 숫자인지 아닌지 확인하는 메소드이다.

 

 


오늘 01단원 String 문제 풀이는 다 했지만 블로그 정리는 오늘 여기까지 마무리 하겠다.

나머지 10-12 세문제는 내일부터 정리해서 올려야겠다. 

주말에 조금이라도 공부해서 다행이다 나자신 ^^!!!!

내일부터 다시 화이팅 하길 🤓

 

반응형
profile

띠오니 개발자 성장일지

@띠오니

포스팅이 좋았다면 "좋아요❤️" 또는 "구독👍🏻" 해주세요!