접근 오류
❗️처음에 생각한 방향
처음에 생각한 방향이 오류없이 한 번에 구현되었음
따라서 접근 오류는 없음 히히 ! ✌️
접근
✅ 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가 필요한 경우가 많으니 구할 생각하기 !
'Algorithm > LeetCode' 카테고리의 다른 글
LeetCode 238. Product of Array Except Self (1) | 2023.08.11 |
---|---|
LeetCode 283. Move Zeroes (0) | 2023.08.11 |
LeetCode 605. Can Place Flowers (0) | 2023.08.10 |
LeetCode 1431. Kids With the Greatest Number of Candies (2) | 2023.08.10 |
LeetCode 1768. Merge Strings Alternately (2) | 2023.08.09 |