본문 바로가기
Java/Java 문제

[코테] level1 - 문자열

by 콧등치기국수 2021. 6. 23.

프로그래머스 사이트에서 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이기 때문이다!

나는 문제를 풀때 전혀 상상도 못했는데 말이지,,,ㅎㅎ

charter타입 '1' -> 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);
}

좌 : str = "123a"일때 split한 결과배열의 길이 --> 4 / 우: str ="123"일때 split한 결과배열의 길이 -->0

 

참고: 

1. 숫자 한글자 기준으로 자르기_split : https://smartpro.tistory.com/10

2. https://hashcode.co.kr/questions/8956/java-%EC%9D%B4%ED%81%B4%EB%A6%BD%EC%8A%A4%EC%97%90%EC%84%9C-int-char-%ED%98%95%EB%B3%80%ED%99%98%EC%8B%9C-%EC%88%AB%EC%9E%90%EA%B0%80-48-%EC%A6%9D%EA%B0%80%ED%95%98%EB%8A%94-%EC%9D%B4%EC%9C%A0%EA%B0%80-%EA%B6%81%EA%B8%88%ED%95%A9%EB%8B%88%EB%8B%A4