공부/Code Cata

비트 AND연산 / std::toupper / std::tolower

동그래님 2024. 12. 30. 11:03

 

*초기 작성 코드

더보기
#include <string>
#include <vector>

using namespace std;

string ChangeString(string Target)
{
    for(int i = 0; i < Target.length(); i++)
    {
        if(i % 2 == 0)
        {
            if(Target[i] >= 'a' && Target[i] <= 'z')
            {
                char ch = Target[i] - 32;
                Target.erase(i, 1);
                Target.insert(i, 1, ch);
            }
        }
        else
        {
            if(Target[i] >= 'A' && Target[i] <= 'Z')
            {
                char ch = Target[i] + 32;
                Target.erase(i, 1);
                Target.insert(i, 1, ch);
            }
        }
    }
    return Target;
}

string solution(string s) 
{
    int t = 0;
    string Answer = "";
    s += " ";
    
    while(s.find(" ", t) != -1)
    {
        string Target = s.substr(t, s.find(" ", t) - t);
        Answer += ChangeString(Target) + " ";
        t = s.find(" ", t) + 1;
    }
    
    Answer.erase(Answer.length() - 1);
    
    return Answer;
}

 

string::find 함수로 공백 문자 단위로 파싱하여 주어진 규칙에 맞게 문자열을 변환하는 함수를 거쳐 다시 solution함수에서 반환된 문자열을 합쳐주는 방식으로 작성하였다.

다른 사람의 문제 풀이를 보고 내 코드를 봤는데 가독성이 좋지 않고, 반복문을 2번 돌아야되기에 속도도 느린 것을 확인했다.

 

 

 

*다른 사람 풀이 참고해서 다시 작성한 코드

#include <string>
#include <vector>

using namespace std;

string solution(string s) 
{
    string Answer = "";
    int t = 1;
    
    for(int i = 0; i < s.length(); i++, t++)
    {
        if(s[i] ==' ')
        {
            Answer += " ";
            t = 0;
        }
        else
        {
            //비트 And 연산자를 활용해서 홀수번째인지, 짝수번째인지 확인
            //toupper함수와 tolower함수를 사용해서 대소문자 변환
            t & 1 ? Answer += toupper(s[i]) : Answer += tolower(s[i]);
        }
    }
    
    return Answer;
}
  • 한 번의 반복문으로 주어진 규칙에 맞게 문자열을 변환할 수 있어서, 가독성이 좋아졌고 속도도 빨라졌다.
  • 비트 And 연산자를 활용해서 해당 문자가 홀수번째인지 짝수번재인지 확인하는 것을 간결하게 작성하였다.
  • toupper 함수와 tolower 함수의 존재를 처음 알았는데 쉽게 대소문자 변환이 가능하고 가독성도 좋아보인다.

 

https://dong-grae.tistory.com/74

 

비트 연산자

비트 And 연산자 / '&' 두 정수의 이진수 표현에서 같은 자리의 비트를 비교하여, 두 비트가 모두 1일 때만 '1'을 반환하고 나머지 경우에는 '0'을 반환하는 연산자이다.하드웨어 수준에서 작동하므

dong-grae.tistory.com

https://dong-grae.tistory.com/75

 

std::toupper / std::tolower

std::toupper / std::tolower toupper('a') = Atolower('Z') = zC++에서 char를 대문자와 소문자로 변환할 때 사용되는 함수이다. 헤더에 정의되어 있고, 단일 문자 변환에 유용하다.내부적으로 문자의 ASCII 값을

dong-grae.tistory.com