사전에 알파벳 모음 'A', 'E', 'I', 'O', 'U'만을 사용하여 만들 수 있는, 길이 5 이하의 모든 단어가 수록되어 있습니다. 사전에서 첫 번째 단어는 "A"이고, 그다음은 "AA"이며, 마지막 단어는 "UUUUU"입니다.
단어 하나 word가 매개변수로 주어질 때, 이 단어가 사전에서 몇 번째 단어인지 return 하도록 solution 함수를 완성해주세요.
다양한 방법이 있다.
가장 무식하고 단순하게 풀었다.
A, E, I, O, U
로 만들 수 있는 모든 경우의 수를 구하고 정렬을 한 다음에 몇 번째 인지 찾았다.5! X 4! X 3! X 2! X 1!
가지 경우의 수가 있기 때문에 충분히 가능할 것 같았다.dfs(word, target)
를 실행하였다.dfs
는 target
길이의 문자열이 생길 때까지 word에 A, E, I, O, U
중 하나를 추가한다.word
의 길이가 target
과 같아지면 해당 문자열을 문자열 배열에 저장한다.A, E, I, O, U
문자 배열 초기화 작업을 v.push_back()
에서 선언하면서 바로 초기화 하는 걸로 변경했다.dfs(string word, int count, int target)
에서 문자 길이로 count
변수를 대신하는 걸로 변경했다.#include <iostream>
#include <string>
#include <vector>
#include <algorithm>
using namespace std;
vector<string> v;
vector<char> alphabet = {'A', 'E', 'I', 'O', 'U'};
void dfs(int target, string word="") {
if (word.size() == target) {
v.push_back(word);
}
else {
for (char c : alphabet) {
word += c;
dfs(target, word);
word.pop_back();
}
}
}
int solution(string word) {
int answer = 0;
for (int i = 1; i <= 5; ++i) {
dfs(i);
}
sort(v.begin(), v.end());
for (int i = 0; i < v.size(); ++i) {
if (word == v[i]) {
answer = i + 1;
break;
}
}
return answer;
}
function solution(word) {
const vowels = ['A', 'E', 'I', 'O', 'U'];
let result = [];
const dfs = (len, res) => {
if (res.length === len) {
result = [...result, res];
} else {
for (let i = 0; i < 5; i++) {
dfs(len, res + vowels[i]);
}
}
}
for (let i = 1; i <= 5; i++) {
dfs(i, '');
}
return result.sort().findIndex(res => res === word) + 1;
}