코딩테스트

[릿코드/js] 다시풀기 345

_서리__ 2023. 9. 13. 23:19
var reverseVowels = function(s) {
    let vowelstr = "aeiouAEIOU"
    let vowelobj = {};
    vowelstr.split('').forEach((el,idx) => vowelobj[el] = true);
    let vowels = [];
    let output = "";
    for (let i = 0; i < s.length; i++)
    {
        if (vowelobj[s[i]])
            vowels.push(s[i]);
    }
    vowels = vowels.reverse();
    let j = 0;
    for (let i = 0; i < s.length; i++)
    {
        if (vowelobj[s[i]])
        {
            output += vowels[j];
            j++;
        }
        else output += s[i];
    }
    return output;
};

-> 처음 푼 풀이. 모음만 따로 저장해놓고 그 친구들 뒤집은 다음에 새로운 문자열을 만들어냈다.

 

var reverseVowels = function(s) {
    let vowelstr = "aeiouAEIOU"
    let vowelobj = {};
    vowelstr.split('').forEach((el,idx) => vowelobj[el] = true);
    let output = s.split('');
    let start = 0;
    let last = s.length - 1;
    while (start < last)
    {
        while (!vowelobj[s[start]] && start < last) start++;
        while (!vowelobj[s[last]] && start < last) last--;
        if(vowelobj[s[start]] && vowelobj[s[last]] && start < last)
        {
        const tmp = output[start];
        output[start] = output[last];
        output[last] = tmp;
        start++;
        last--;
        }
    }
    return output.join('');
};

-> 두번째 푼 풀이. 양쪽에 인덱스를 놓고, 그 친구들을 뒤집으면 된다고 생각했지만 매번 start < last가 있어 보기에도 안좋고 성능도 잘 안나옴.

 

var reverseVowels = function(s) {
    let vowelstr = "aeiouAEIOU"
    let vowelobj = {};
    vowelstr.split('').forEach((el,idx) => vowelobj[el] = true);
    let output = s.split('');
    let start = 0;
    let last = s.length - 1;
    while (start < last)
    {
        if (!vowelobj[s[start]]) start++;
        if (!vowelobj[s[last]]) last--;
        if (vowelobj[s[start]] && vowelobj[s[last]])
        {
            let tmp = output[start];
            output[start] = tmp;
            output[start] = output[last];
            output[last] = tmp;
            start++;
            last--;
        }
    }
    return output.join('');
};

조금은 간결해진것도 같다.