#1. 문제
#2. 풀이
1. map 컨테이너
map 컨테이너는 C++ 표준라이브러리에서 제공하는 연관 컨테이너로 키와 값을 쌍으로 S저장합니다. map 컨테이너는 레드-블랙 트리(균형 이진트리)로 구현되어 있으며, 데이터 항목의 삽입/삭제 작업 시 내부적으로 정렬 작업을 수행하여 정렬된 상태를 유지하는 특징을 갖고 있습니다. 더불어, map 컨테이너는 Key 값의 중복을 허용하지 않습니다.
2. substr(), isalpha(), toupper(), transform()그리고 find()까지!
- 먼저, string1을 두 문자로 substr() 한 뒤, transform()과 toupper()를 활용해 해당 문자들을 Upper-Case로 변환해줍니다.
- 그리고, 두 문자의 alphabet여부를 isalpha()를 통해 확인하고, unionSet의 총 원소 개수를 +1 증가, 그리고 map 컨테이너 내부 해당 문자들을 키로 하는 값을 +1 증가시켜 줍니다.
- 다음 string2에 대하여 1~2번을 동일하게 진행해 줍니다. 이때, map 컨테이너에 대하여 find() 알고리즘을 통해 크기가 2로 substr 한 문자열이 이미 존재하는지 확인합니다.
- 만약, map 컨테이너에 이미 존재하는 문자열일 경우, 해당 키 값에 대하여 값을 -1 감소시켜 주고, jointSeㅅ의 총 원소 개수를 +1 시켜줍니다.
- 만약, map 컨테이너에 존재하지 않는 문자열일 경우, unionSet의 총 원소 개수에 +1 해줍니다.
- 마지막으로, unionSet의 총 원소 개수가 0이라면 65536을 출력하고 종료시킵니다. 반대로, unionSet의 총 원소 개수가 0이 아니라면, jointSet / unionSet * 65536 연산의 결과 값을 출력해 줍니다.
#3. 코드
#include <string>
#include <algorithm>
#include <cctype>
#include <map>
using namespace std;
int solution(string str1, string str2)
{
int answer = 0;
map<string, pair<int, int>> m;
double unionSet = 0;
double jointSet = 0;
for (int i = 0; i < str1.length() - 1; ++i)
{
string tmp = str1.substr(i, 2);
transform(begin(tmp), end(tmp), begin(tmp), ::toupper);
if (isalpha(tmp[0]) && isalpha(tmp[1]))
{
m[tmp].first++;
unionSet++;
}
}
for (int i = 0; i < str2.length() - 1; ++i)
{
string tmp = str2.substr(i, 2);
transform(begin(tmp), end(tmp), begin(tmp), ::toupper);
if (isalpha(tmp[0]) && isalpha(tmp[1]))
{
auto it = m.find(tmp);
if (it != end(m) && it->second.first > 0)
{
it->second.first--;
jointSet++;
}
else
{
unionSet++;
}
}
}
if (unionSet == 0)
{
return 65536;
}
answer = (int)((jointSet / unionSet) * 65536);
return answer;
}
'문제 풀이 > Programmers 문제 풀이' 카테고리의 다른 글
[Programmers]#Level2_더 맵게, 우선순위 큐, 최소 힙 (0) | 2024.04.14 |
---|---|
[Programmers]#Level2_전화번호 목록, 해시 자료구조, us 컨테이너, 트라이 검색 트리 (0) | 2024.04.14 |
[Programmers]#Level2_피로도, 완전 탐색, DFS, 깊이 우선 탐색, 백트래킹 (0) | 2024.04.08 |
[Programmers]#Level2_프로세스, 큐, 우선순위 큐 (0) | 2024.04.08 |
[Programmers]#Level2_기능 개발, 스택, ceil(), 실수와 정수의 혼용 연산 (0) | 2024.03.21 |