PROGRAMMERS-962 행성에 불시착한 우주비행사 머쓱이는 외계행성의 언어를 공부하려고 합니다. 알파벳이 담긴 배열 spell과 외계어 사전 dic이 매개변수로 주어집니다. spell에 담긴 알파벳을 한번씩만 모두 사용한 단어가 dic에 존재한다면 1, 존재하지 않는다면 2를 return하도록 solution 함수를 완성해주세요.
배열 spell에 담긴 알파벳이 포함된 단어가 있어야 하는 게 아니라 '한 번씩, 모두 사용한 단어'가 존재해야 하기 때문에 빈도수 체크가 필요하다고 생각했다.
먼저 알파벳 소문자로만 이루어졌다는 조건에서 착안해 길이가 26인 정수형 배열 spellFreq를 선언했다. 다음으로는 for문을 돌며 spell의 알파벳을 받아온다. 이때, String 타입이 아닌 Character 타입으로 바꾸기 위해 s.charAt()을 사용했고 여기서 'a'를 빼 알파벳에 따라 0~25로 달라지는 인덱스 값을 만들어냈다. 그렇게 만들어진 인덱스의 값을 +1 해주어 spell에 존재하는 원소들의 종류를 파악한다.
다음으로는 dic 원소들의 빈도수를 체크한다. 이를 위해 for문 안에서 길이가 26인 정수형 배열 wordFreq를 선언한다. 다음으로는 toCharArray()를 사용해 받아온 dic의 원소(단어)를 문자 배열 형태로 만들고, 루프를 돌며 위에서 한 것과 동일한 방식으로 인덱스의 값을 +1 해준다.
이후 Arrays.equals()를 통해 두 배열 spellFreq와 wordFreq가 같은지 체크한다. wordFreq에는 dic의 한 단어에 해당하는 알파벳 빈도수가 담겨 있다. 만약 '한 번씩, 모두' 사용해야 한다는 조건에 부합한다면 순서야 어떻든 spellFreq와 wordFreq 두 배열의 값들은 일치할 것이다. (이렇게 빈도수를 체크하면 spell 원소들을 모두 사용했지만 2번 이상인 경우를 거를 수 있다.)
단어가 dic에 하나라도 존재한다면 1을 return하면 되므로 if문 안에 바로 return 1을 명시했고, 그렇지 않으면 for문을 다 돌고 난 뒤 return 2 하도록 했다.
import java.util.Arrays;
class Solution {
public int solution(String[] spell, String[] dic) {
int[] spellFreq = new int[26];
for(String s : spell){
spellFreq[s.charAt(0) - 'a']++;
}
for(String word : dic){
int[] wordFreq = new int[26];
for(char c : word.toCharArray()) {
wordFreq[c - 'a']++;
}
if(Arrays.equals(spellFreq, wordFreq)){
return 1;
}
}
return 2;
}
}
