코딩 테스트 준비-숫자 문자열과 영단어
주중에 릴리즈 때문에 바빠서 코딩 테스트 준비가 조금 소홀해졌지만, 주말에는 적어도 한문제씩은 풀고 기술 블로그에 해당 내용을 올려보려고 한다.
오늘 풀어봤던 문제는 2021년 카카오 채용연계형 인턴십 기출 문제로 프로그래머스 기준으로 레벨 1이었고, 지난번 풀었던 레벨 1 문제 보다는 훨씬 수월하였다.
문제
네오와 프로도가 숫자놀이를 하고 있습니다. 네오가 프로도에게 숫자를 건넬 때 일부 자릿수를 영단어로 바꾼 카드를 건네주면 프로도는 원래 숫자를 찾는 게임입니다.
다음은 숫자의 일부 자릿수를 영단어로 바꾸는 예시입니다.
1478 → "one4seveneight"
234567 → "23four5six7"
10203 → "1zerotwozero3"
이렇게 숫자의 일부 자릿수가 영단어로 바뀌어졌거나, 혹은 바뀌지 않고 그대로인 문자열 s가 매개변수로 주어집니다. s가 의미하는 원래 숫자를 return 하도록 solution 함수를 완성해주세요.
참고로 각 숫자에 대응되는 영단어는 다음 표와 같습니다.
풀이
Brute-force와 정규표현식을 활용해 쉽게 풀 수 있던 문제였다.
풀이 로직을 설명하자면 다음과 같다.
1. s를 split해 array로 만들어준다.
2. 코드의 효율성을 위해 스트링빌더를 생성해준다.
3. array를 순환하면서 숫자 정규표현식에 맞으면 스트링빌더에 그대로 append.
4. 정규 표현식에 맞지 않는 다면 텍스트이기 때문에 텍스트에 맞는 값에 해당하는 값을 append 해주고 순회 번호(i)를 올바르게 올려준다.(ex. array[i]가 z였다면 zero값이 들어간 것이기 떄문에 스트링 빌더에 0을 더해주고 i값에 3을 더해준다.)
5. 스트링빌더를 스트링으로 바꾼 값을 정수로 바꿔 반환해준다.
import java.util.*;
import java.util.regex.Pattern;
class Solution {
public int solution(String s) {
StringBuilder answerBuilder = new StringBuilder();
String[] array = s.split("");
String pt = "^[0-9]+$";
for(int i=0; i<array.length; i++){
if(Pattern.matches(pt, array[i])==true){
answerBuilder.append(array[i]);
}
else{
if(array[i].equals("z")){
i+=3;
answerBuilder.append(0);
}
else if(array[i].equals("o")){
i+=2;
answerBuilder.append(1);
}
else if(array[i].equals("t")){
if(array[i+1].equals("w")){
i+=2;
answerBuilder.append(2);
}else{
i+=4;
answerBuilder.append(3);
}
}
else if(array[i].equals("f")){
if(array[i+1].equals("o")){
i+=3;
answerBuilder.append(4);
}else{
i+=3;
answerBuilder.append(5);
}
}
else if(array[i].equals("s")){
if(array[i+1].equals("i")){
i+=2;
answerBuilder.append(6);
}else{
i+=4;
answerBuilder.append(7);
}
}
else if(array[i].equals("e")){
i+=4;
answerBuilder.append(8);
}
else{
i+=3;
answerBuilder.append(9);
}
}
}
return Integer.parseInt(answerBuilder.toString());
}
}
다른 사람의 풀이
다른 사람의 풀이를 보니 훨씬 replaceAll 메써드를 활용해 훨씬 더 간결한 해결방안을 제시하였다.
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);
}
}
로직은 다음과 같다
1. strArr에 순차적으로 0~9에 해당하는 숫자의 스트링 값을 넣어준다.
2. strArr의 replaceAll을 활용해 배열에서 zero값 부터 nine까지 순차적으로 0~9로 변환해준다.
느낀점
이번 문제는 나도 비교적 수월하게 풀었다고 생각했는데, replaceAll 메써드로 훨씬 수월하게 풀 수 있다는 사실에 감탄했다. 조금씩 공부해 나가면서 보다 효율적, 그리고 간결한 코드를 배워 나가야 할 것 같다.
Author And Source
이 문제에 관하여(코딩 테스트 준비-숫자 문자열과 영단어), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://velog.io/@ubrain/코딩-테스트-준비-숫자-문자열과-영단어저자 귀속: 원작자 정보가 원작자 URL에 포함되어 있으며 저작권은 원작자 소유입니다.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)