LeetCode 345. Reverse Vowels of a String

728x90

접근 오류

❗️처음에 생각한 방향

처음에 생각한 방향이 오류없이 한 번에 구현되었음

 

따라서 접근 오류는 없음 히히 ! ✌️

 

접근

✅ string의 맨 앞에서 시작하는 포인터(head)와 맨 뒤에서 시작하는 포인터(tail)를 각각 둔 뒤,

       포인터를 각자 방향으로 옮겨가며 둘 다 vowel인 경우 Swap할 것

       ( 정확히 말하자면 포인터보다는 인덱스가 맞는 말 )

 

모음인지 확인할 수 있는 함수는 switch 문을 사용해 따로 만들 것

     - 이렇게 생각한 이유는,

     문제 조건에 ASCII로 표현가능한 모든 문자라고 했기 때문에 대소문자 포함 10개이고,

     10개 모두 동일하게 true가 반환되는 간단한 함수이므로

     그냥 따로 빼서 계산하는 것이 편하다고 생각함

 

Loop의 조건을 무엇으로 할 것인가?

보통 head와 tail을 두고 푸는 문제의 경우, head와 tail의 index가 역전되면 Loop를 빠져나오는 것이 일반적

-  이 문제의 경우에도, 두 포인터가 역전되는 순간부터는 이미 한 번씩 검열을 한 character이기 때문에 더이상 반복문을 돌릴 필요가 없음

  따라서 ( head < tail ) 조건이 유지되는 동안만 조건문 탐색하면 됨

 

구현

bool isVowel(char c){
    switch(c){
        case 'a':
        case 'A':
        case 'e':
        case 'E':
        case 'i':
        case 'I':
        case 'o':
        case 'O':
        case 'u':
        case 'U':
            return true;
        default: return false;
    }
}

char * reverseVowels(char * s){
    int len = strlen(s);
    int head = 0;
    int tail = len-1;
    char* temp;

    while(head < tail){
        if(isVowel(s[head])) {
            if(isVowel(s[tail])){
                temp = s[head];
                s[head]=s[tail];
                s[tail]=temp;
                head++;
                tail--;
            } else tail--;
        } else head++;
    }
    return s;
}

틈새 자랑

Memory는 최적화를 잘 하진 못했지만

Runtime에서는 1등 !

 

Take aways

✅ switch로 편하게 사용할 수 있는 경우가 있다면 사용해주기

  - switch로 구분할 수 있는 것은, int 및 character

  - switch case를 위와 같이 상세 명시하지 않는다면, 모두 동일하게 마지막에 명시한 것으로 코드 구현됨.

     (위 코드의 경우, case 'a' 부터 case 'U' 까지는 모든 true를 return 하게 됨)

 

✅ 기본적인 부분 : String 배열은 parameter로 전해질 때 항상 크기를 알 수 없기 때문에

1. 매개변수로 크기를 같이 전해주거나

2. strlen을 통해 크기를 따로 알아내야함

특히 string pointer를 받는 경우, size가 필요한 경우가 많으니 구할 생각하기 !