프로그래머스

[프로그래머스_Level1] 숫자 문자열과 영단어

빙수빈수 2021. 7. 18. 13:17

https://programmers.co.kr/learn/courses/30/lessons/81301

 

코딩테스트 연습 - 숫자 문자열과 영단어

네오와 프로도가 숫자놀이를 하고 있습니다. 네오가 프로도에게 숫자를 건넬 때 일부 자릿수를 영단어로 바꾼 카드를 건네주면 프로도는 원래 숫자를 찾는 게임입니다. 다음은 숫자의 일부 자

programmers.co.kr

[문제]

네오와 프로도가 숫자놀이를 하고 있습니다. 네오가 프로도에게 숫자를 건넬 때 일부 자릿수를 영단어로 바꾼 카드를 건네주면 프로도는 원래 숫자를 찾는 게임입니다.

다음은 숫자의 일부 자릿수를 영단어로 바꾸는 예시입니다.

  • 1478 → "one4seveneight"
  • 234567 → "23four5six7"
  • 10203 → "1zerotwozero3"

 

이렇게 숫자의 일부 자릿수가 영단어로 바뀌어졌거나, 혹은 바뀌지 않고 그대로인 문자열 s가 매개변수로 주어집니다. s가 의미하는 원래 숫자를 return 하도록 solution 함수를 완성해주세요.

참고로 각 숫자에 대응되는 영단어는 다음 표와 같습니다.

 

<숫자영단어>

0 zero
1 one
2 two
3 three
4 four
5 five
6 six
7 seven
8 eight
9 nine

 

[제한사항]

  • 1 ≤ s의 길이 ≤ 50
  • s가 "zero" 또는 "0"으로 시작하는 경우는 주어지지 않습니다.
  • return 값이 1 이상 2,000,000,000 이하의 정수가 되는 올바른 입력만 s로 주어집니다.

 

[코드]

class Solution {
public int solution(String s) {
        String answer="";
        
        for(int i=0;i<s.length();i++) {
        	char ch=s.charAt(i);
        	
        	// 읽은 문자가 숫자인 경우
        	if(ch>='0'&&ch<='9') 
        		answer+=ch;
        	
        	/*
        	 * 읽은 문자가 알바펫인 경우 i번째 문자와 다음 문자(i+1)를 통해
        	 * 어떤 숫자인지 파악한 후 숫자를 answer에 저장하고,
        	 * 다음 읽어야할 인덱스 i를 해당 숫자의 길이만큼 증가시킨다.
        	 */
        	else {
        		switch(ch) {
        		// z로 시작하는 영단어는 zero밖에 없다.
        		case 'z':
        			answer+='0'; // 영단어에 맞는 숫자 answer에 저장
        			i+=3; // zero 문자열의 길이만큼 i증가
        			break;
        		// o로 시작하는 영단어는 one밖에 없다.
        		case 'o':
        			answer+='1'; 
        			i+=2; 
        			break;
        		/*
        		 * t로 시작하는 숫자 영단어는 two와 three가 있다.
        		 * 이럴 경우에는 i+1번째 알파벳을 비교하여 어떤 숫자인지 알아낸다. 
        		 */
        		case 't':
        			// tw로 시작하는 영단어는 two밖에 없다.
        			if(s.charAt(i+1)=='w') {
        				answer+='2';
        				i+=2;
        				break;
        			}
        			// th로 시작하는 영단어는 three밖에 없다.
        			if(s.charAt(i+1)=='h') {
        				answer+='3';
        				i+=4;
        				break;
        			}
        		case 'f':
        			// fo로 시작하는 영단어는 four밖에 없다.
        			if(s.charAt(i+1)=='o') {
        				answer+='4';
        				i+=3;
        				break;
        			}
        			// fi로 시작하는 영단어는 five밖에 없다.
        			if(s.charAt(i+1)=='i') {
        				answer+='5';
        				i+=3;
        				break;
        			}
        		case 's':
        			if(s.charAt(i+1)=='i') {
        				answer+='6';
        				i+=2;
        				break;
        			}
        			if(s.charAt(i+1)=='e') {
        				answer+='7';
        				i+=4;
        				break;
        			}
        		// e로 시작하는 영단어는 eight밖에 없다.
        		case 'e':
        			answer+='8';
        			i+=4;
        			break;
        		// n으로 시작하는 영단어는 nine밖에 없다.
        		case 'n':
        			answer+='9';
        			i+=3;
        			break;
        		}
        	}
        }
        // 함수의 반환형이 int이기 때문에 문자열을 int형으로 변환하여 return 한다.
        return Integer.parseInt(answer);
    }
}

 

[고찰]

 각 숫자 영단어는 두 번째 알파벳 까지만 비교해보면 어떤 숫자 영단어인지 알 수 있기 때문에 쉽게 해결할 수 있는 문제였다. 문자를 비교 후 어떤 숫자인지 알아내고 해당 문자열 만큼 다음 비교 인덱스를 증가시켜준다. 단, 결과가 저장되어 있는 answer는 String 자료형이기 때문에 int형으로 바꿔주는 parseInt함수를 사용하여 정답을 return 해야한다.

 

<숫자를 문자열로 바꾸는 함수>

자료형 함수
정수(Int) Integer.toString
실수(Float) Float.toString
실수(Double) Double.toString
롱(Long) Long.toString

 

<문자열을 숫자로 바꾸는 함수>

자료형 함수
정수(Int) Integer.parseInt
실수(Float) Float.parseFloat
실수(Double) Double.parseDouble
롱(Long) Long.parseLong

 

즉, 숫자를 문자열로 변환하는 함수는 toString, 문자열을 숫자로 변환하는 함수는 parse를 사용한다.