문자열 다루기 기본

SaGo_MunGcci·2022년 7월 16일
0
  • 문제

요약 : 자바의 변수, 자료형, 기본함수 외에 더많은 함수를 사용해야된다는 것을 알게 되었다. 구글링을 자주 이용하자.

  • 문제접근
    문제를 읽었을때 문자열을 하나씩 잘라내서 문자형으로 변환하고 각각 문자를 정수형인지 문자형인지 비교해서 문자가 모두 정수형이고 모두 문자형이면 true 아니면 false로 반환하여 해결하려고 접근
	    boolean answer;
        char s_char;

        int count_num = 0;
        int count_char = 0;       

            for (int i = 0; i < s.length(); i++) {

                //System.out.println(s.charAt(i));

                s_char = s.charAt(i);

                // 문자열에 숫자가 몇개 문자가 몇개인지 검증.
                if (Character.getNumericValue(s_char)) {

                    count_num++;

                } else {

                    count_char++;

                }
            }
        

        // 문자열이 모든 숫자인지 문자인지 검증.
        if(count_num == 0 && count_char == s.length()){

            return true;

        }else if(count_num == s.length() && count_char == 0){

            return true;

        }else {

            return false;

        }

//        System.out.println(count_num);
//        System.out.println(count_char);
//
//
//        return answer;
    }

}
  • 결과는 광탈

  • 나의 알고리즘 이해는 이러했다.

  1. s로 받은 문자열을 char로 하나씩 분리한다.
  2. 분리한 문자를 정수인지 문자인지 구분한다.
  3. 각각 문자가 정수형이면 정수 카운팅 문자이면 문자 카운팅
  4. 길이전체가 정수, 길이전체가 문자이면 true 아니면 false를 반환함.
  • 문제 재접근

  • 아... 자세히 보니까 처음 Character.getNumericValue(s_char)이게 형변환을 하는 코드였다. 우연하게도 내가 인텔리제이로 사용한 테스트 케이스가 String str = "1234"여서 맞다고 나와서 문제가 없는 줄 알았다.

  • 즉 이때 내가 필요한 것은 2번을 수행할 코드가 필요했다. 근데 아무리 로직을 짜도 해결할 방법이 없다고 판단했고 이 기능을 하는 함수가 있을것이라는 결론에 이르렀다. 그래서 프로젝트를 진행하고 있는 팀원에게 혹시 이런 기능을 하는 함수가 있을까요? 라고 여쭤보니 알고리즘 문제는 30분이상 잡고있기 보다는 구글링을 통해서 예제를 보라고 권유를 하셨고 그말이 맞다라고 생각하고 2번에 해당하는 함수를 검색였다.

- Character.isDigit()

참고 : https://kkh0977.tistory.com/40
1. Character.isDigit 을 사용해 문자인지 숫자인지 확인할 수 있다.
2. true값 일 경우 숫자이며, false값 일 경우 문자이다.

  • 일단 내가 원하는 함수를 찾았고 나의 로직에 적용하는 게 문제였다.
    Character.isDigit()의 괄호안이 배열이 들어가게 되어있어서 char타입을 char배열로 바꿔야 했다.

  • 그리고 제한 사항 길이는 1이상 8이하라고 되어있는 것을 보았다. 이부분도 좀 걸렸다.

  • 따라서 새로운 함수를 나의 로직에 적용한 결과 코드는 다음과 같다.

public class Q17 {

    public boolean solutionQ17(String s) {
		// boolean 초기화;
        boolean answer;
        
        // Character.isDigit()을 사용하기 위해,()안에 넣어서 사용하기위해
        // char를 char[]로 선언함. 배열의 길이는 s의 길이만큼 선언 
        char[] s_char = new char[s.length()];
		
        // 정수형 카운트 초기화
        int count_num = 0;
        // 문자형 카운트 초기화
        int count_char = 0;
		
        // 길이가 4 또는 6이라면.
        if(s.length() ==4 || s.length() == 6) {
			
            // 길이만큼 반복하는 반복문 실행
            for (int i = 0; i < s.length(); i++) {
				// 출력확인
                //System.out.println(s.charAt(i));
				
                // 각각 자른 문자열을 char배열에 인덱스 별로 추가
                s_char[i] = s.charAt(i);

                // 배열에 추가한 문자열에 숫자가 몇개, 문자가 몇개인지 검증.
                if (Character.isDigit(s_char[i])) {
					
                    count_num++;

                } else {

                    count_char++;

                }
            }
            // 길이가 안맞으면 false출력
        } else {

            return false;

        }

        // 문자열이 모든 숫자인지 문자인지 검증.
        if(count_num == 0 && count_char == s.length()){

            return true;

        }else if(count_num == s.length() && count_char == 0){

            return true;

        }else {

            return false;

        }

    }

}
  • 통과 되었다.

  • 이 문제를 통해서 1. 문제를 잘 이해하자, 2. 제한사항을 체크하자, 3. 새로운 함수, 효율적인 함수를 공부해야된다는 깨달음을 얻었다.

profile
이리저리 생각만 많은 사고뭉치입니다.

0개의 댓글