코딩테스트 연습/2021 카카오 채용연계형 인턴십숫자 문자열과 영단어

2021. 10. 26. 10:50알고리즘

문자열 s  = 숫자 + 영단어 one two three .. ~nine 으로 이루어진 문자열

solution 함수를 통해서 전부 숫자로 바꿔서 출력하면됨 의미하는 원래숫자 = int 형

 

my 풀이

package prt1;

public class MainEntry {

	public static void main(String[] args) {
		System.out.println("hello world");
		solution("123");
		System.out.println(solution("23four5six7"));
		
		
}

	public static int solution(String s) {
 		
        char[] str = s.toCharArray();
        int answer = 0;
        
        
        for(int i = 0 ; i < str.length; i++) {
        		if(10 <= Character.getNumericValue(str[i]) && Character.getNumericValue(str[i]) <= 35){
        			if(Character.getNumericValue(str[i]) == 35) {
        			answer *= 10;
        			i += 3;

            		}
        			else if(Character.getNumericValue(str[i]) == 24) {
            			answer *= 10;
            			answer += 1;
            			i += 2;
        			}
        			else if(Character.getNumericValue(str[i]) == 29 && Character.getNumericValue(str[i+1]) == 32) {
            			answer *= 10;
            			answer += 2;
            			i += 2;
        			}
        			else if(Character.getNumericValue(str[i]) == 29 && Character.getNumericValue(str[i+1]) == 17) {
            			answer *= 10;
            			answer += 3;
            			i += 4;
        			}
        			else if(Character.getNumericValue(str[i]) == 15 && Character.getNumericValue(str[i+1]) == 24) {
            			answer *= 10;
            			answer += 4;
            			i += 3;
        			}
        			else if(Character.getNumericValue(str[i]) == 15 && Character.getNumericValue(str[i+1]) == 18) {
            			answer *= 10;
            			answer += 5;
            			i += 3;
        			}
        			else if(Character.getNumericValue(str[i]) == 28 && Character.getNumericValue(str[i+1]) == 18) {
            			answer *= 10;
            			answer += 6;
            			i += 2;
        			}
        			else if(Character.getNumericValue(str[i]) == 28 && Character.getNumericValue(str[i+1]) == 14) {
            			answer *= 10;
            			answer += 7;
            			i += 4;
        			}
        			else if(Character.getNumericValue(str[i]) == 14) {
            			answer *= 10;
            			answer += 8;
            			i += 4;
        			}
        			else if(Character.getNumericValue(str[i]) == 23) {
            			answer *= 10;
            			answer += 9;
            			i += 3;
        			}
        			
        		
        		}else {
            		answer *= 10;
                	answer += Character.getNumericValue(str[i]);	
            	}
        	}
            return answer;
    }

}

 

기본적으로 문자열을 한글자 한글자씩 검사를 해야하니깐 배열로 만들 생각을 했던거 같음 

여기서 문자열 = > char 배열

        char[] arr = str.toCharArray(); 해서 간단하게 만들어주고

 

mainentry 에서 계속 실행해보면서 진행함

그리고  Character.getNumericValue(arr[i]) 를 사용 문자배열의 요소요소의 값을 인수화 해서 조건에 대입

 

'1' 문자 = 값 1

'9' 문자 = 값 9 

 

Character.getNumericValue('a') 의 값은 10 

Character.getNumericValue('z') 의 값은 35

근데 이렇게 하면 대소문자 구분은 안됨 'A' = 10임

 

그냥 Character.getNumericValue 이거 쓰지말고 'a' <= arr[i] <='z' 이렇게 써서 아스키코드값으로 비교 해버리면 간단함.

그리고 for문 돌리면서 if 조건 주면서 각 영단어에 해당하는 case를 만들어서 처리함 

 

이게 내가 푼 풀이 그리고 쫌 신박하게 보이는 풀이

class Solution {
    public int solution(String s) {
        String[] strArr = {"zero", "one", "two", "three", "four", "five", "six", "seven", "eight", "nine"};
        for(int i = 0; i < strArr.length; i++) {
            s = s.replaceAll(strArr[i], Integer.toString(i));
        }
        return Integer.parseInt(s);
    }
}

문자열을 자식으로 가지는 strArr 문자열 배열을 만든다. 각 영단어에대해 적고

매개변수로 받은 s 에 replaceAll사용해서 zero = 0 one = 1 ~ 반복문 돌려서 넣어주고 

마지막으로  string 인 s 를 Interger.parseInt 사용해서 int 형으로 변환해서 리턴값을 준다.

 

Interger.toString  int 를 문자열로

서로 반대의 관계

Integer.parseInt() 문자열을  int로