<문제 제시>
<문제설명>
머쓱이는 태어난 지 6개월 된 조카를 돌보고 있습니다.
조카는 아직 "aya", "ye", "woo", "ma" 네 가지 발음을 최대 한 번씩 사용해 조합한(이어 붙인)
발음밖에 하지 못합니다. 문자열 배열 babbling이 매개변수로 주어질 때,
머쓱이의 조카가 발음할 수 있는 단어의 개수를 return하도록 solution 함수를 완성해주세요.
<예시 입출력>
<문제 해결 과정>
옹알이로 발음할 수 있는 문자가 해당 문자열에 포함되어있는지를 판단하는 문제였다.
임의로 문자열을 쪼개서 검사할 수 없기 때문에 처음에는 조금 난잡한 조건문으로 풀어보았다.
Try 1)
//babbling[i] 의 길이가 15에 가까울수록 더 복잡해지므로 수정필요
// 주어진 문자열 갯수만큼 반복하면서
for(int i = 0; i < babbling.length; i++) {
// 각 문자 별 조합 가능한 것들을 분석
// 기본적으로 aya, ye, woo, ma를 포함하는지 확인
if(babbling[i].contains("ye") || babbling[i].contains("ma")) {
//포함한다면 그 인덱스 위치 반환해서 새로운 문자열을 만든 후 그 문자열을 재탐색
if(babbling[i].contains("ye")){
index = babbling[i].indexOf("ye");
babbling[i].substring(index + 2);
}
else if(babbling[i].contains("ma")){
index = babbling[i].indexOf("ma");
babbling[i].substring(index + 2);
}
}
else if(babbling[i].contains("aya") || babbling[i].contains("woo")) {
//포함한다면 그 인덱스 위치 반환해서 새로운 문자열을 만든 후 그 문자열을 재탐색
if(babbling[i].contains("aya")) {
index = babbling[i].indexOf("aya");
babbling[i].substring(index + 3);
}
else if(babbling[i].contains("woo")) {
index = babbling[i].indexOf("woo");
babbling[i].substring(index + 3);
}
}
}
옹알이 배열의 길이가 길수록 점점 복잡해지는 단점이 있고, 테스트케이스도 여럿 통과하지 못하였다.
Try 2)
// 오답과 함께 모든 경우의 수를 만드는 것이 비효율적임
for(int i = 0; i < babbling.length; i++) {
// 단일로 포함하는 경우
if(babbling[i].contains("aya") || babbling[i].contains("ye")
|| babbling[i].contains("woo") || babbling[i].contains("ma")) {
answer++;
}
// 복수개를 포함하는 경우 (1) - aya를 포함하는 경우
else if(babbling[i].contains("aya")){
// aya를 포함하면서 >> ye or woo or ma를 포함하는 경우
if(babbling[i].contains("ye")) answer += 2;
else if(babbling[i].contains("woo")) answer += 2;
else if(babbling[i].contains("ma")) answer += 2;
}
// 복수개를 포함하는 경우 (2) - ye를 포함하는 경우
else if(babbling[i].contains("ye")){
// ye를 포함하면서 >> woo or ma를 포함하는 경우
if(babbling[i].contains("woo")) answer += 2;
else if(babbling[i].contains("ma")) answer += 2;
}
// 복수개를 포함하는 경우 (3) - woo를 포함하는 경우
else if(babbling[i].contains("woo")){
// woo를 포함하면서 >> ma를 포함하는 경우
if(babbling[i].contains("ma")) answer += 2;
}
// 복수개를 포함하는 경우 (4) - aya와 ye를 포함하는 경우
else if(babbling[i].contains("aya") && babbling[i].contains("ye")){
// aya와 ye를 포함하면서 >> woo or ma를 포함하는 경우
if(babbling[i].contains("woo")) answer += 3;
else if(babbling[i].contains("ma")) answer += 3;
}
}
두번째로 시도한 코드 또한 모든 경우의 수를 조건문으로 일일이 만들어주어 복잡한 로직이었다.
또한 테스트케이스에는 다양한 조건이 있기때문에 보여지지 않는 테스트케이스의 조건 또한 맞추는 것은
해결가능성이 미지수였다.
Solution 1)
발음이 가능한 부분을 "공백"으로 치환하여 마지막까지 치환되지 않는 문자열을 제외한 것을 count시키면 될 것 같았다.
// replaceFirst는 처음 발견되는 문자만 치환시켜주는 메서드
// 처음발견되는 "xxx"만 "O"로 바꿔준다.
babbling[i] = babbling[i].replaceFirst("aya", "O");
babbling[i] = babbling[i].replaceFirst("ye", "O");
babbling[i] = babbling[i].replaceFirst("woo", "O");
babbling[i] = babbling[i].replaceFirst("ma", "O");
옹알이에 포함되는 문자가 발견되면 .replaceFirst() 메서드를 통해 "O"문자로 바꿔준다.
// 일치하는 것들은 공백으로 바꿔준 후
babbling[i] = babbling[i].replace("O", "");
System.out.println(babbling[i]);
// 모두 공백으로 바꿔졌으면 문자열에 가능한 s문자만 포함된것이므로
// 공백을 검사하여 모두 공백이면 answer++; 누적
if(babbling[i].isEmpty()) {
answer = answer + 1;
}
다시한번 "O"인 문자들은 공백으로 바꿔준다 = replace("O", "");
해당 문자열이 모두 공백이면 = isEmpty()
answer를 증가시켜 카운트 시킨다.
<전체코드>
public class babbling {
public static int solution(String[] babbling) {
int answer = 0;
for(int i = 0; i < babbling.length; i++) {
// replaceFirst는 처음 발견되는 문자만 치환시켜주는 메서드
// 처음발견되는 "xxx"만 "O"로 바꿔준다.
babbling[i] = babbling[i].replaceFirst("aya", "O");
babbling[i] = babbling[i].replaceFirst("ye", "O");
babbling[i] = babbling[i].replaceFirst("woo", "O");
babbling[i] = babbling[i].replaceFirst("ma", "O");
// 일치하는 것들은 공백으로 바꿔준 후
babbling[i] = babbling[i].replace("O", "");
System.out.println(babbling[i]);
// 모두 공백으로 바꿔졌으면 문자열에 가능한 s문자만 포함된것이므로
// 공백을 검사하여 모두 공백이면 answer++; 누적
if(babbling[i].isEmpty()) {
answer = answer + 1;
}
}
return answer;
}
public static void main(String[] args) {
String[] babbling = {"ayaye", "uuuma", "ye", "yemawoo", "ayaa"};
System.out.println(solution(babbling));
}
}
문자열 치환과 문자열을 바꾸는 replaceFirst(), replace() 메서드에 대해 친숙하지 않아 초반 풀이과정에서
다소 버거웠다. 문자열을 다루는 메서드를 좀 더 공부해야겠다는 생각을 하게되었다.
문제링크)
https://school.programmers.co.kr/learn/courses/30/lessons/120956
프로그래머스
코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.
programmers.co.kr
'Algorithms > 프로그래머스' 카테고리의 다른 글
[프로그래머스] '순서쌍의 개수' - Java (0) | 2023.04.27 |
---|---|
[프로그래머스] '진료 순서 정하기' - Java (0) | 2023.04.27 |
[프로그래머스] '대문자와 소문자' - Java (0) | 2023.04.26 |
[프로그래머스] '배열 뒤집기' - Java (0) | 2023.04.17 |
[프로그래머스] '외계행성의 나이' - Java (0) | 2023.04.16 |