해당 문제는 순회를 이용하면서 각 단어에 문자열이 하나씩 들어있는지를 확인하는 문제인데요.
문제는 각 문자열들이 불변 타입이다보니 배열에서 데이터를 하나 빼오는 작업과는 다르게 배열에서 문자열을 뺴와서 거기서 또 문자열을 빼는 상당히 복잡한 구조의 문제라고 생각이 되었습니다.
그래서 저는 원본 배열을 변경하지 않는 선에서 매번 for문을 돌때마다 해당 단어가 배열의 영단어를 포함하고 있다면, 그만큼 집어온 단어의 길이를 빼주고, for문을 다 돌린 뒤 단어의 길이가 0이 될때, 즉 네 가지의 단어의 특정 부분을 포함하고 남은 길이가 없는 단어임이 판명날 때 count를 증가하는 방법으로 해당 문제를 풀게 되었는데요.
이건 코드를 봐야 좀 더 이해가 가실거라 생각이 되니 코드를 살펴보도록 하겠습니다.
- 자바스크립트 버전
function solution(babbling) { let arr = ["aya", "ye", "woo", "ma"]; // 조건에 맞으면 누적할 count 변수 let count = 0; // 첫번째 for문은 전달 받은 bablling 배열만큼 돌면서 for(let i = 0 ; i < babbling.length ; i++){ // babbling의 i번째 문자열과 그 길이를 가져와주고 let word = babbling[i]; let length = word.length; // 두번째 for문은 미리 설정해 놓은 네 가지 단어가 있는 arr 배열을 사용하여 만약 해당 단어가 arr 배열의 단어를 포함하고 있다면 그 단어의 길이만큼 단어의 길이를 빼줍니다. for(let j = 0 ; j < arr.length ; j++){ if(word.includes(arr[j])){ length -= arr[j].length } } // babbling 배열의 특정 단어에 대해 arr 배열의 모든 단어를 한 번씩 체킹하고 난 뒤 length가 0이라는 뜻은 arr 배열의 단어들을 다 하나씩 사용하면서 babbling 배열의 특정 단어에 포함되어 있는 것을 확인했고, 그래서 조건문에 의한 코드문이 발동되어 길이가 줄어들 때 0이 되었다는 것은 해당 arr의 단어들 외의 단어가 없는 상태임을 의미하므로 count를 증가시켜 줍니다. (즉 해당 arr 배열의 단어들을 하나씩만 사용하여 babbling의 특정 단어를 완전히 완성할 수 있음을 의미함) if(length == 0) count++; } return count; }
그리고 자바 버전으로 구현한 코드는 다음과 같습니다.
- 자바 버전
import java.util.Arrays; import java.util.List; public class Solution { public static int solution(String[] babbling) { String[] arr = {"aya", "ye", "woo", "ma"}; int count = 0; for(int i = 0 ; i < babbling.length ; i++){ boolean flag = true; String word = babbling[i]; int length = word.length(); for(int j = 0 ; j < arr.length ; j++){ if(word.contains(arr[j])){ length -= arr[j].length(); } } if(length == 0) count++; } return count; } }
JS
는 includes
, 자바
는 contains
를 사용하며, 문자열의 길이를 출력할 때 JS
는 length
필드만 써도 되지만, 자바
는 length()
메서드를 작성해 주어야 합니다.