https://programmers.co.kr/learn/courses/30/lessons/81301
[문제]
네오와 프로도가 숫자놀이를 하고 있습니다. 네오가 프로도에게 숫자를 건넬 때 일부 자릿수를 영단어로 바꾼 카드를 건네주면 프로도는 원래 숫자를 찾는 게임입니다.
다음은 숫자의 일부 자릿수를 영단어로 바꾸는 예시입니다.
- 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를 사용한다.
'프로그래머스' 카테고리의 다른 글
[프로그래머스_Level1] 키패드 누르기 (0) | 2021.07.18 |
---|---|
[프로그래머스_Level1] 소수 만들기 (0) | 2021.07.18 |
[프로그래머스_Level1] 모의고사 (0) | 2021.07.16 |
[프로그래머스_Level1] 예산 (0) | 2021.07.16 |
[프로그래머스_Level1] 약수의 개수와 덧셈 (0) | 2021.07.16 |