https://school.programmers.co.kr/learn/courses/30/lessons/81301
문제
네오와 프로도가 숫자놀이를 하고 있습니다. 네오가 프로도에게 숫자를 건넬 때 일부 자릿수를 영단어로 바꾼 카드를 건네주면 프로도는 원래 숫자를 찾는 게임입니다.
다음은 숫자의 일부 자릿수를 영단어로 바꾸는 예시입니다.
- 1478 → "one4seveneight"
- 234567 → "23four5six7"
- 10203 → "1zerotwozero3"
이렇게 숫자의 일부 자릿수가 영단어로 바뀌어졌거나, 혹은 바뀌지 않고 그대로인 문자열 s가 매개변수로 주어집니다. s가 의미하는 원래 숫자를 return 하도록 solution 함수를 완성해주세요.
참고로 각 숫자에 대응되는 영단어는 다음 표와 같습니다.
풀이
알파벳으로 쓰여있는 것을 모두 숫자로 바꾼 결과를 return 하는 문제이다.
필자는 switch 문으로 모든 경우를 따지는 것 밖에 생각이 나지 않아서, 그나마 효율적으로 구현하는 방법을 생각해 보았다.
단어의 첫 글자만 보아도 숫자를 알 수 있는 단어는 4개, 두 번째 글자까지 보아야 알 수 있는 단어는 3쌍(6개)이다.
따라서 해당 경우에 맞게 각 단어의 숫자가 무엇인지 찾았고, 이후 해당 단어의 알파벳 총 개수만큼은 반복문 돌리는 것을 건너뛰었다.
예를 들어 단어 첫 글자가 'z'일 경우, 'zero'이므로 결과에 0을 더하고, 총 4글자이므로 반복문을 3번 스킵하는 방식으로 구현하였다.
case 'z':
answer += 0;
i += 3;
break;
🔔 switch 문을 사용한 코드
class Solution {
public int solution(String s) {
int answer = 0;
for(int i = 0; i < s.length(); i++) {
char c = s.charAt(i);
answer *= 10;
if(c >= '0' && c <= '9') answer += (c - '0');
switch(c) {
case 'z':
answer += 0;
i += 3;
break;
case 'o':
answer += 1;
i += 2;
break;
case 'e':
answer += 8;
i += 4;
break;
case 'n':
answer += 9;
i += 3;
break;
case 't':
if(s.charAt(i + 1) == 'w') {
answer += 2;
i += 2;
} else {
answer += 3;
i += 4;
}
break;
case 'f':
if(s.charAt(i + 1) == 'o') {
answer += 4;
i += 3;
} else {
answer += 5;
i += 3;
}
break;
case 's':
if(s.charAt(i + 1) == 'i') {
answer += 6;
i += 2;
} else {
answer += 7;
i += 4;
}
break;
}
}
return answer;
}
}
하지만 다른 사람들의 풀이를 보니 replaceAll() 함수를 사용하는 것이 훨씬 깔끔하다는 것을 알게 되었고, 필자도 replaceAll() 함수를 사용하여 다시 풀어보았다.
코드
class Solution {
public int solution(String s) {
int answer = 0;
String[] numbers = {"zero", "one", "two", "three", "four", "five", "six", "seven", "eight", "nine"};
for(int i = 0; i < numbers.length; i++) {
s = s.replaceAll(numbers[i], Integer.toString(i));
}
answer = Integer.parseInt(s);
return answer;
}
}
틀린 부분이 있다면 정정해 주시면 감사하겠습니다.
궁금한 부분이 있거나, 다른 아이디어가 있으시면 자유롭게 댓글 남겨주세요!
'[JAVA]프로그래머스 > Lv.1' 카테고리의 다른 글
[JAVA]프로그래머스 - 둘만의 암호 (0) | 2024.04.12 |
---|---|
[JAVA]프로그래머스 - 크기가 작은 부분 문자열 (0) | 2024.04.11 |
[JAVA]프로그래머스 - 삼총사 (0) | 2024.04.09 |
[JAVA]프로그래머스 - 바탕화면 정리 (0) | 2024.04.07 |
[JAVA]프로그래머스 - 달리기 경주 (0) | 2024.04.05 |