관리 메뉴

기억을 위한 기록들

[Code Wars] Replace With Alphabet Position(C++) 본문

Coding Test - cpp/Etc

[Code Wars] Replace With Alphabet Position(C++)

에드윈H 2023. 12. 20. 15:11

https://www.codewars.com/kata/546f922b54af40e1e90001da/train/cpp

 

Codewars - Achieve mastery through coding practice and developer mentorship

A coding practice website for all programming levels – Join a community of over 3 million developers and improve your coding skills in over 55 programming languages!

www.codewars.com

 

문제는 이렇다

 

In this kata you are required to, given a string, replace every letter with its position in the alphabet.
If anything in the text isn't a letter, ignore it and don't return it.
"a" = 1, "b" = 2, etc.

 

이 문제에서는 문자열이 주어진 모든 문자를 알파벳의 위치로 바꾸어야 합니다.
텍스트에 있는 것이 글자가 아니라면 무시하고 반환하지 마십시오.
예를 들어 "a" = 1, "b" = 2,..

 

문제는 크게 어렵지 않다. 주어진 문자열에 있는 글자에 대한 알파벳의 위치( a가 1부터 순차적으로..)으로 변경하는 것이다.

 

 

내가 작성한 코드

#include <string>
#include <sstream>
#include <cctype>


std::string alphabet_position(const std::string &text) {
  
    std::stringstream ss(text);
    std::string Result;
  
    // 공백을 기준으로 문자열 분리
    std::string token;
    while (ss >> token) 
    {
        int value = 0;
        for(auto item : token)
        {
           if('a' <=item && item <= 'z')
           {
             value = (int)(item) - 96;
            Result += std::to_string(value) + " ";
             
           }else if('A' <=item && item <= 'Z')
           {
             value = (int)(item) - 64;
            Result += std::to_string(value) + " ";             
           }    
        }
    }
  
    if (!Result.empty()) 
    {
        Result.pop_back();
    }
  
  return Result;
}

 

 

 

다른 사람 풀이

#include <cctype>
#include <sstream>
#include <string>

std::string alphabet_position(const std::string &s) {
  std::stringstream ss;
  for (auto &x : s)
  {
    if (std::isalpha(x))
    {
    	ss << (x | 32) - 96 << ' ';
     }
  }
  std::string r = ss.str();
  if (r.size())
  {
  	r.pop_back();
  }
  return r;
}

 

이 글을 작성한 이유가 사실 다른 사람의 코드를 보고 작성하게 되었다.여기서 이 부분이다.

ss << (x | 32) - 96 << ' ';

 

ASCII 코드에서 대문자와 소문자 사이의 차이는 32이고, 비트 OR 연산을 사용하여 6번째 비트를 1로 설정함으로써 +32가 된다. 그렇게 되면 대문자를 소문자로 변환하게 한다. 그후에 96을 빼서, ASCII 코드에서 소문자 'a'의 값은 97이기 때문에, 'a'가 1의 위치에 오도록 하기 위해 96을 뺀다