프로그래머스 사이트에서 level1문제 중 하나이 '문자열 다루기 기본'을 풀었다.
https://programmers.co.kr/learn/courses/30/lessons/12918
1. 문제
문자열 s의 길이가 4 혹은 6이고, 숫자로만 구성돼있는지 확인해주는 함수, solution을 완성하세요. 예를 들어 s가 "a234"이면 False를 리턴하고 "1234"라면 True를 리턴하면 됩니다.
2. 내 풀이
//문자열다루기 기본
public boolean solution1(String s) {
boolean answer = false;
if(s.length()==4 || s.length()==6) {
for(int i=0; i<s.length(); i++) {
String si = String.valueOf(s.charAt(i));
try{
int ii = Integer.valueOf(si); //NumberFormatException 발생
}catch(NumberFormatException e) {
return answer;
}
}
answer = true;
return answer;
}else {
return answer;
}
}
1) 문자열의 길이가 4 또는 6인지 확인하고 그렇지 않다면 false를 리턴한다.
2) 문자열의 길이가 4또는 6이라면 문자가 포함되어 있는지 검사한다.
3) for문과 charAt(인덱스)을 이용하여 문자열 s의 각 요소를 뽑아낸다.
4) char형으로 얻어지므로 String.valueOf를 이용해 String으로 변환해 si로 저장한다.
5) int ii = Integer.valueOf(si); 에서 si가 int가 아닌 경우에는 NumberFormatException 이 발생한다.
6) 따라서 NumberFormatException이 발생하면 s에 문자가 끼어있었다는 뜻이고 catch문에 잡혀서 false가 되고,
s에 문자가 끼어있지 않다면 for문을 다 돌기 때문에 for문을 마친 후 true를 반환하게 해준다.
처음부터 try/catch문을 사용할 생각은 없었는데, 풀다보니
int ii = Integer.valueOf(si); 에서 NumberFormatException이 발생해서 try/catch문을 이용해서 해결했다.
2-1. 다르게 풀어보기
이번에는 NumberFormatException이 발생하지 않으면서 풀리도록 하고 싶어서 다르게 풀어봤다.
처음에 charAt한 결과를 자동형변환이 되게 int로 받았는데
돌려보니 결과값이 내가 생각한 int는 0~9였는데 49~57이 나왔다...
그 이유는 character타입의 '1'은 아래 표에서와 같이 10진수로 나타내면 49이기 때문이다!
나는 문제를 풀때 전혀 상상도 못했는데 말이지,,,ㅎㅎ
public boolean solution1_1(String s) {
if(s.length()==4 || s.length()==6) {
for(int i=0; i<s.length(); i++) {
//int ch = s.charAt(i); --> int로 자동형변환되면 숫자가 커진다,,,
char ch = s.charAt(i);
System.out.println(ch);
if(ch<'0' || ch>'9') {
return false;
}
}
return true;
}else {
return false;
}
}
1) character 타입도 >,<를 이용한 비교가 가능하다!
2) character로 String의 요소 하나하나를 받고 int로 형변환을 시키면 char형일때 값이 int로 바뀌는 거니까 내가 원하는 값이 아니고 위에 표의 값이 된다!!
3. 다른사람풀이
한 줄로 푸신게 너무 신기해서 어떻게 푼 건지 살펴봤다. 대단해,,,
class Solution {
public boolean solution(String s) {
return (s.length() != 4 && s.length() != 6) || (s.split("[0-9]").length > 0) ? false:true;
}
}
1) split()
-> String[ ] 반환한다.
-> split( "[0-9]" ) : 숫자 한글자를 단위로 끊어줌
--> String str이 숫자로만 되어있는 경우 반환되는 String[]에는 아무것도 저장되지 않는다!!!
* split() 사용법
public void test() {
String str = "123a";
String[] sArr = str.split("[0-9]");
for(int i=0; i<sArr.length; i++) {
System.out.println("i ("+i+") : "+sArr[i] );
}
System.out.println(sArr.length);
String str1 = "Hi,Hello,Ho";
String[] sArr1 = str1.split(",");
for(int i=0; i<sArr1.length; i++) {
System.out.println("i ("+i+") : "+sArr1[i] );
}
System.out.println(sArr1.length);
}
참고:
1. 숫자 한글자 기준으로 자르기_split : https://smartpro.tistory.com/10
'Java > Java 문제' 카테고리의 다른 글
[Java] 객체배열 & mvc 문제 정리1_(객체배열 복사_System.arraycopy( )) (0) | 2021.05.18 |
---|---|
[Java] 조건문(if, switch)_실습문제 (0) | 2021.05.08 |
[Java] 배열_실습문제(easy & hard) (0) | 2021.05.05 |