[Programmers] 84512번 - 모음사전 [Java][C++]
[Programmers] 84512번 - 모음사전 [Java][C++]
1. 아이디어
알파벳 모음 A, E, I, O, U만을 사용하여 만들 수 있는, 길이 5 이하의 모든 단어가 수록되어 있는 사전에서 word가 몇 번째 단어인지 return하는 문제다. 모음이 5가지이고 단어의 길이도 최대 5라서 모든 가능한 단어를 미리 구해 배열에 담은 후 사전 순으로 정렬하고 몇 번째에 위치하는지 찾는 방식을 활용했다.
2. 복잡도
| 시간복잡도 | 공간복잡도 |
|---|---|
| $O(K^L \cdot L\log(K^L))$ | $O(K^L \cdot L)$ |
$K$ = 모음 개수(5), $L$ =
word최대 길이(5)
3. 코드
풀이 [Java][C++]
중복 순열을 활용해 길이 1 부터 5까지 가능한 단어 조합을 구해서 리스트에 넣은 후 정렬을 수행하고 리스트를 순회하며 단어를 발견하면 return을 해줬다.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
import java.util.*;
class Solution {
static List<String> list = new ArrayList<>();
static char[] arr = {'A', 'E', 'I', 'O', 'U'};
static char[] sel = new char[5];
public int solution(String word) {
for (int i = 1; i <= 5; i++) {
dfs(0, i);
}
list.sort(Comparator.naturalOrder());
for (int i = 0; i < list.size(); i++) {
if (list.get(i).equals(word)) {
return i + 1;
}
}
return 0;
}
static void dfs(int idx, int len) {
if (idx == len) {
StringBuilder sb = new StringBuilder();
for (int i = 0; i < len; i++) {
sb.append(sel[i]);
}
list.add(sb.toString());
return;
}
for (char c : arr) {
sel[idx] = c;
dfs(idx + 1, len);
}
}
}
중복 순열을 활용해 길이 1 부터 5까지 가능한 단어 조합을 구해서 벡터에 넣은 후 정렬을 수행하고 벡터를 순회하며 단어를 발견하면 return을 해줬다.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
#include <algorithm>
#include <string>
#include <vector>
using namespace std;
vector<string> v;
string arr = "AEIOU";
string sel(5, ' ');
void dfs(int idx, int len) {
if (idx == len) {
v.push_back(sel.substr(0, len));
return;
}
for (char c : arr) {
sel[idx] = c;
dfs(idx + 1, len);
}
}
int solution(string word) {
for (int i = 1; i <= 5; i++) {
dfs(0, i);
}
sort(v.begin(), v.end());
for (int i = 0; i < v.size(); i++) {
if (v[i] == word) {
return i + 1;
}
}
return 0;
}
This post is licensed under CC BY 4.0 by the author.