본문 바로가기
알고리즘/Codewars

Codewars - [7 kyu] Reverse words

by 개발자J의일상 2022. 5. 3.
반응형

Questions

space 마다 단어를 반대로 만들어서 리턴해주는 문제이다. space의 개수 만큼 reverse words에도 추가해줘야 한다.

 

Examples

"This is an example!" ==> "sihT si na !elpmaxe"
"double  spaces"      ==> "elbuod  secaps"

 

Solutions

using namespace std;

int checkEmptyCount(string str, int startIndex)
{
  int count = 0;
  for(int i=startIndex; i<(int)str.size(); i++)
  {
    if(str[i] == ' ') count++;
    else break;
  }
  return count;
}
string reverse_words(string str)
{
  string reverse;
  char * start = &str[0];
  char * end = &str[0];
  if (str.empty()) {
    return reverse;
  }
  
  for(int i=0; i<(int)str.size(); i++)
  {
    if(str[i] == ' ')
    {
      end--;
      char * temp = &str[i];
      while(start != end)
      {
        reverse += *end;
        end--;
      }
      reverse += *start;
      int empty_count = checkEmptyCount(str, i);
//       cout << "empty_count = " << empty_count << endl;      
      for(int j=0; j<empty_count; j++) {
          reverse += ' ';
          temp++;
          i++;
      }
//       cout << "reverse = " << reverse << endl;
//       cout << "i = " << i << " size = " << str.size() << endl;
//       cout << "temp = " << temp << " start = " << *start << " end = " << *end << endl;
      if (i == str.size()) return reverse;
      start = temp;
      end = temp;
    }
    end++;
  }
  end--;
  //cout << "start = " << *start << " end = " << *end <<endl;
  while(start != end)
  {
    reverse += *end;
    end--;
  }
  reverse += *start;

  //cout << "reverse2 = " << reverse << endl;
  return reverse;
}

내 솔루션은 two pointer 전략으로 2개의 포인터(start, end)를 가지고 있고

문자의 size만큼 for문을 돌면서 space가 나오면 end에서 부터 start까지 내려가면서 reverse문자열에 넣어주는 방식이다. 

이렇게 코딩을 하니 디버깅해야 될 것들이 많았다. 예외 케이스들이 많아서...

뭔가 깔끔한 코드는 아닌 것 같다.

 

그래서 best 답안을 가지고 왔다. 

std::string reverse_words(std::string str)
{
  std::string out;
  std::string cword;
  for (char c : str) {
    if (c == ' ') {
      out += cword;
      out += c;
      cword = "";
      continue;
    }
    cword = c + cword;
  }
  out += cword;
  return out;
}

여기도 for문으로 str을 전부 도는건 동일하고 c가 space이면 out에 cword를 저장하고 c를 저장하는데 cword는 space에 오면 매번 초기화 된다. 

cword = c + cword; 이므로 str이 거꾸로 저장이되는 것이다.

 

예를 들어 아래 str 이 아래 문장이면

This is an example!

sihT가 cword에 저장이 되고 이제 c가 This와 is 사이에 오면 out에 sihT를 저장하고 out에 c (여기서 space)를 저장한다. 

그리고 cword를 초기화 해주는데 여기서 신박했던게 space가 여러번 오면 어떻게 처리하지? 고민했는데 

c가 space이면 out에 c를 추가해주면 되는거였다. cword는 공백일거라 문제가 없을거고...

내가 짠 방식에서는 이러한 방식이 불가능했어서 space가 오면 space가 연속으로 몇개오는지 구해서 그만큼 c의 위치를 옮겨주는 방식이었는데 더 복잡했던 것 같다.

 

이번 문제는 여기까지!

 

300x250

'알고리즘 > Codewars' 카테고리의 다른 글

Codewars - [5 kyu] Simple assembler interpreter  (0) 2022.04.29
Codewars - [6 kyu] Sum consecutives  (0) 2022.01.17

댓글