문제
머쓱이는 태어난 지 11개월 된 조카를 돌보고 있습니다. 조카는 아직 "aya", "ye", "woo", "ma" 네 가지 발음과 네 가지 발음을 조합해서 만들 수 있는 발음밖에 하지 못하고 연속해서 같은 발음을 하는 것을 어려워합니다. 문자열 배열 babbling이 매개변수로 주어질 때, 머쓱이의 조카가 발음할 수 있는 단어의 개수를 return하도록 solution 함수를 완성해주세요.
제한사항
- 1 ≤ babbling의 길이 ≤ 100
- 1 ≤ babbling[i]의 길이 ≤ 30
- 문자열은 알파벳 소문자로만 이루어져 있습니다.
import java.util.HashMap;
class Solution {
public int solution(String[] babbling) {
// aya, ye, woo, ma
int answer = 0;
StringBuilder wordSb = new StringBuilder();
HashMap<String, Integer> babblingMap = new HashMap<String, Integer>() {{
put("aya", 0);
put("ye", 0);
put("woo", 0);
put("ma", 0);
}};
for(String babble : babbling) {
String prevWord = "";
boolean canSay = true;
for(int b = 0; b < babble.length(); b++) {
wordSb.append(babble.charAt(b));
if(babblingMap.get(wordSb.toString()) != null && !prevWord.equals(wordSb.toString())) {
prevWord = wordSb.toString();
wordSb.setLength(0);
}
else if(wordSb.length() == 3) {
canSay = false;
break;
}
}
if(wordSb.length() != 0) {
canSay = false;
wordSb.setLength(0);
}
if(canSay) {
answer++;
}
}
return answer;
}
}
이번 옹알이 문제는 그냥 replace 메서드로 해결하자니 "연속해서 같은 발음을 하는 것을 어려워한다" 라는 조건이 머릴 복잡하게 했다.
결국 문자를 하나씩 읽어와서 hashmap에 있는지 체크 후, 그걸 이전 단어를 뜻하는 prevWord 변수에 넣고 비교를 했다.
사실 이전에 말했던 단어인지 체크 할 필요 없이 처음부터 같은 발음이 두 번 연속되어있는 문자열은 continue 시켜주기만 하면 되는 간단한 문제였다.
class Solution {
public int solution(String[] babbling) {
int answer = 0;
for(String babble : babbling) {
if(babble.contains("ayaaya") || babble.contains("yeye") || babble.contains("woowoo") || babble.contains("mama")) {
System.out.println(babble);
continue;
}
babble = babble.replace("aya", ".");
babble = babble.replace("ye", ".");
babble = babble.replace("woo", ".");
babble = babble.replace("ma", ".");
babble = babble.replace(".", "");
if(babble.length() == 0) {
answer++;
}
}
return answer;
}
}
하지만...
이게 처음 코드의 결과다.
처음 코드가 더 빠르다!!
두번째 코드는 조건 자체는 간단하지만, replace 를 계속 쓰면서 문자열에 변형을 자꾸 주다보니 속도가 느려진 것 같다.
그에 비해 처음 코드는 조건이 상대적으로 더 복잡하지만, 문자열의 변형은 문자를 더해나가는 것 뿐이며 StringBuilder 객체를 사용했고 전체적으론 거의 비교 연산밖에 없다.
아마 좀 더 가독성이 좋게 리팩토링을 거친다면 확실하게 처음 알고리즘이 더 좋지 않을까?
출처
https://school.programmers.co.kr/learn/courses/30/lessons/133499