Notice
Recent Posts
Recent Comments
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | 6 | 7 |
8 | 9 | 10 | 11 | 12 | 13 | 14 |
15 | 16 | 17 | 18 | 19 | 20 | 21 |
22 | 23 | 24 | 25 | 26 | 27 | 28 |
29 | 30 | 31 |
Tags
- 정렬
- 델리게이트
- 스마트포인터
- BFS
- UE4 커스텀로그
- 프로그래머스
- UELOG
- C++최적화
- stl
- 강참조
- dataasset
- map
- 언리얼엔진구조체
- 크리티컬섹션
- C++
- 자료구조
- UML관련
- UE_LOG
- 약참조
- 선택정렬
- unorder_map
- enumasByue
- 데이터애셋
- moreeffectiveC++
- 람다사용정렬
- 언리얼가비지컬렉터
- 알고리즘
- 람다
- 정렬알고리즘
- 애셋로드
Archives
- Today
- Total
기억을 위한 기록들
[Code Wars] Replace With Alphabet Position(C++) 본문
https://www.codewars.com/kata/54bf1c2cd5b56cc47f0007a1/train/cpp
문제는 다음과 같다
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;
});
}
'Coding Test - cpp > Etc' 카테고리의 다른 글
[Code Wars] Build Tower(C++) (1) | 2024.02.22 |
---|---|
[Code Wars] Take a Ten Minutes Walk(C++) (1) | 2024.01.09 |
[Code Wars] Replace With Alphabet Position(C++) (1) | 2023.12.20 |
[Code Wars] Buying a car(C++) (0) | 2023.12.08 |
[프로그래머스 Lv 0] 안전지대 C++ (0) | 2023.11.28 |