본문 바로가기
연습장

Duplicate Encoder

by anothel 2021. 10. 12.

Intructions

The goal of this exercise is to convert a string to a new string where each character in the new string is "(" if that character appears only once in the original string, or ")" if that character appears more than once in the original string. Ignore capitalization when determining if a character is a duplicate.

 

Examples

  • "din"      =>  "((("
  • "recede"   =>  "()()()"
  • "Success"  =>  ")())())"
  • "(( @"     =>  "))((" 

 

Solution

std::string duplicate_encoder(const std::string &word) {
  std::string sReternValue;
  bool bIsbreak = false;

  for (unsigned long i = 0; i < word.length(); i++) {
    bIsbreak = false;
    for (unsigned long j = 0; j < word.length(); j++) {
      if (i == j) continue;
      if (::toupper(word.at(i)) == ::toupper(word.at(j))) {
        sReternValue += ")";
        bIsbreak = true;
        break;
      } else {
        continue;
      }
    }

    if (bIsbreak == false) {
      sReternValue += "(";
    } else {
      continue;
    }
  }

  return sReternValue;
}

 

kaluzap의 코드

#include <string>
#include <cctype>

std::string duplicate_encoder(const std::string &word) {
  std::map<char, int> table;
  for (auto x : word) table[std::tolower(x)]++;

  std::string result;
  for (auto x : word) result += (table[std::tolower(x)] == 1) ? "(" : ")";

  return result;
}

 

후기

파라미터로 단어를 전달받아 단어의 개수만큼 "(" 혹은 ")"를 출력하는데, 해당 캐릭터가 단어 내에 2개 이상 있다면 그 순서에는 ")"를 출력하는 문제였다. 평소 C/C++ 개발자라고 떠들고 다녔는데, 남의 코드를 본 후 내가 과연 C/C++ 개발자가 맞는지 의심스러워졌다. 왜냐하면 ++를 제외한 오로지 C 스타일의 코드를 머릿속에서 구상하고 있으며, 사실 남의 코드에서 이렇게도 간결해질 수 있다는 점에서 너무 놀랐다. for문을 사용할 때 단어의 길이를 알아온 후 해당 길이만큼 for문을 돌렸는데, 이미 for (auto x : word)로써 길이를 가져올 필요도 없게 된 것이다. 더군다나, 어떤 자료형 인지도 고민할 필요 없도록 auto 자료형을 사용했다. map 자료구조를 사용한 것은 둘째 치고, 익숙해져야 할 새로운 모던 C++의 요소를 찾은 것 같아 기쁜 마음으로 책을 펴고 다시 공부해야겠다.

 

(url: https://www.codewars.com/kata/54b42f9314d9229fd6000d9c/cpp)

 

728x90