관리 메뉴

기억을 위한 기록들

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

Coding Test - cpp/Etc

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

에드윈H 2023. 12. 21. 10:59

https://www.codewars.com/kata/54bf1c2cd5b56cc47f0007a1/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

 

문제는 다음과 같다

Write a function that will return the count of distinct case-insensitive alphabetic characters and numeric digits that occur more than once in the input string.
입력 문자열에서 두 번 이상 발생하는 구별되는 영문자와 숫자 숫자의 카운트를 반환하는 함수를 작성합니다.


The input string can be assumed to contain only alphabets (both uppercase and lowercase) and numeric digits.
입력 문자열은 알파벳(대소문자 모두)과 숫자만 포함한다고 가정할 수 있습니다.

 

예)

 

 

문제는 주어진 문자열에서 영문자와 숫자가 두 번 이상 존재하는 문자들이 총 몇 개인지 반환하는 것이다.

 

이전 글에서 작성했던 문자 |(or연산자) 32 를 활용(대소문자 변환 : https://hyo-ue4study.tistory.com/590) 해서 풀어보았다.

 

내가 처음 풀은 코드 : 

#include <string>
#include <map>

std::size_t duplicateCount(const std::string& in)
{
    std::map<char,int> m;
  
    for(const auto item : in)
    {
      m[item|32]++;  
    }
  
    std::size_t result = 0;
  
    for(const auto& item:m)
    {
      if(2<=item.second)
      {
        result+=1;  
      }
    }
    
    return result;
}

 

 

여기서 풀고 제출 한뒤, 다른 사람의 풀이를 보고 배운점이 하나 있다.

다른 사람 풀이 참고 :

#include <string>
#include <unordered_map>
#include <algorithm>

#include <cctype>

std::size_t duplicateCount(const char* in) {
  std::unordered_map<char, unsigned> counts;
  for (const char* c = in; *c != '\0'; ++c) {
    ++counts[tolower(*c)];
  }
  return std::count_if(cbegin(counts), cend(counts), [](const auto& count) {
      return count.second > 1;
    });
}

 

다른 사람의 코드를 보고 배운점은 std::count_if이다. 이 함수를 자주 사용해보지 않아서 생각을 못했는데 적용해서 동일하게 제출해 보았다. 코드 성능 자체는 크게 향상되거나 그런건 없는데(count_if 함수 자체도 O(n)으로 되어있다고 한다.), 사람이 보기에 훨씬 간결해졌다.

 

재 재출용:

#include <string>
#include <map>

std::size_t duplicateCount(const std::string& in)
{
    std::map<char,int> m;
  
    for(const auto item : in)
    {
      m[item|32]++;  
    }
  
  return std::count_if(cbegin(m), cend(m), [](const auto& m) {
      return 2 <= m.second;
    });
}