내 풀이
크게 두 덩어리로 나눠 로직을 작성했다.
1. solution()
- for문을 돌며 주어진 배열 안의 각 단어들을 split으로 쪼개서 또다른 배열에 넣어줌
- 새로 생성된 배열을 check(따로 생성한 함수)로 검사
- 각 검사 결과에 따라 answer에 숫자를 더함
- answer 를 반환
2. check() (추가로 생성한 함수임)
- 입력받은 배열을 검사하는 용도의 함수
- for문으로 배열의 크기만큼 반복하며 switch문에 배열에서 꺼내온 문자를 대입
- switch문에서 각 문자별로 뒷 문자들과 합치면 조카가 발음할 수 있는 단어가 되는지 체크 + 단어가 연속되는지 체크
- 체크 결과에 따라 boolean 값 반환
[코드보기]
class Solution {
public int solution(String[] babbling) {
boolean bool;
int answer = 0;
for(String str : babbling) {
String[] baba = str.split("");
bool = check(baba);
if(bool) {answer++;}
}
return answer;
}
public static boolean check(String[] list) {
String[] say = { "aya", "ye", "woo", "ma" };
boolean bool = false;
String before = "1";
int num =0;
int size = list.length;
for(int i =0; i < list.length; i++) {
switch(list[i]) {
case "a" :
if(i < size-2) {
String aya = list[i]+list[i+1]+list[i+2];
if(aya.equals(say[0]) && !before.equals(say[0])) {
num += 3;
before = aya;
}
}
break;
case "y" :
if(i < size-1) {
String ye = list[i]+list[i+1];
if(ye.equals(say[1]) && !before.equals(say[1])){
num += 2;
before = ye;
}
}
break;
case "w":
if(i < size-2) {
String woo = list[i]+list[i+1]+list[i+2];
if(woo.equals(say[2])&& !before.equals(say[2])) {
num += 3;
before = woo;
}
}
break;
case "m" :
if(i < size-1) {
String ma = list[i]+list[i+1];
if(ma.equals(say[3])&& !before.equals(say[3])) {
num += 2;
before = ma;
}
}
break;
}
}
if(size==num) {bool = true;}
return bool;
}
}
다른 사람의 풀이
다른 풀이를 찾아보니 replaceAll()
과 String.fomat()
을 사용한 경우도 있었다.
[코드보기]
class Solution {
public int solution(String[] babbling) {
int count = 0;
for (String babb : babbling) {
if (isPronouncable(babb)) count++;
}
return count;
}
private boolean isPronouncable(String word) {
final String[] words = {"aya", "ye", "woo", "ma"};
for (String w : words) {
word = word.replaceAll(String.format("%s(?!%s)", w, w), "-");
}
return word.replaceAll("-", "").isEmpty();
}
}
replaceAll()
은 대상 문자열을 원하는 문자 값으로 변환하는 함수인데 replace()
와는 다르게 정규표현식을 인자로 넣을 수 있다는 것이 특징이다.
따라서 위 코드는 정규 표현식에 따라 값을 체크하여 바로바로 문자열 일부를 바꿔넣을 수 있게끔 되어있다.
그리고 그 정규 표현식을 위해 String.format()
을 사용했는데
여기서 %s(?!%s)
은 앞문자열(?!뒷문자열)
이런식으로 포맷 되며 이는 앞문자열 뒤에 뒷문자열이 오지 않는 경우에 진행시킨다는 뜻이다.
정규 표현식 관련 자료는 여기 참고 링크(클릭) 에서 확인 가능하다.
댓글남기기