https://school.programmers.co.kr/learn/courses/30/lessons/120838
#include <string>
#include <vector>
// #include <iostream>
#include <bits/stdc++.h>
using namespace std;
string solution(string letter) {
string answer = "";
unordered_map<string, string> morse = {
{".-","a"},
{"-...","b"},
{"-.-.","c"},
{"-..","d"},
{".","e"},
{"..-.","f"},
{"--.","g"},
{"....","h"},
{"..","i"},
{".---","j"},
{"-.-","k"},
{".-..","l"},
{"--","m"},
{"-.","n"},
{"---","o"},
{".--.","p"},
{"--.-","q"},
{".-.","r"},
{"...","s"},
{"-","t"},
{"..-","u"},
{"...-","v"},
{".--","w"},
{"-..-","x"},
{"-.--","y"},
{"--..","z"}
};
string tmp;
for(auto c: letter){
if(c==' '){
answer+=morse[tmp];
tmp="";
}
else tmp+=c;
}
answer+=morse[tmp];
return answer;
}
문제에서 매우 불친절하게 morse 값을 주어서, 이 경우 일일이 하나씩 수정하려 했는데, 질문게시판을 보니까 누군가가 c++로 문제를 푸는 사람들을 위해 미리 만들어놓고 제공해주시는 분이 있어서 그분이 만들어놓은 형태를 가져다 썼다.
그리고 tmp 값에 char들을 저장해 나가다가, 공백 (' ') 을 만나면 answer에 그동안 쌓인 값들을 통해 키로 밸류값을 찾아서 answer 스트링에 밸류들을 추가시키게 코드를 작성했다.
이때에 tmp에 쌓인 char들을, 혹은 tmp 내용 자체의 string 밸류를 어떻게 초기화 시킬까 생각해보다 해당 함수가 있을것 같은데 생각이 안나서 gpt에 검색해보았고, 그때에 나온 방법중에 하나로 tmp=""; 형태로 빈 스트링을 할당하는것으로 초기화를 진행하는 방식을 선택했다.
검색해서 나온 tmp을 초기화 하는 방법들에 대해서 한번 확인해보면,
C++의 `std::string` 객체를 비우는 방법은 다음과 같이 할 수 있습니다:
1. **`clear` 메서드 사용**: `clear` 메서드를 호출하여 문자열을 비울 수 있습니다.
```cpp
#include <iostream>
#include <string>
int main() {
std::string myString = "Hello, World!";
myString.clear(); // 문자열 비우기
std::cout << "Cleared string: " << myString << std::endl;
return 0;
}
```
2. **대입 연산자 (`=`)를 사용하여 빈 문자열로 대체**: 새로운 빈 문자열을 생성하여 기존 문자열을
대체할 수 있습니다.
```cpp
#include <iostream>
#include <string>
int main() {
std::string myString = "Hello, World!";
myString = ""; // 빈 문자열로 대체
std::cout << "Cleared string: " << myString << std::endl;
return 0;
}
```
두 가지 방법 모두 문자열을 비울 수 있지만, `clear` 메서드는 문자열 객체를 재사용할 때 유용합니다.
문자열을 변경하지 않고 그대로 사용해야 할 때 `clear` 메서드를 사용하여 기존 데이터를 지울 수 있습니다.
위와같이 tmp.clear(); 을 사용하던가, tmp=""; 형태로 사용하던가 두가지 방법을 사용할 수 있었다. 뭔가 clear() 함수가 있을것 같았는데, 저런식으로 사용하는건 생각하지 못해서 사용하지 못했다. 다음에 이런 경우를 만나면, (string의 이름).clear() 형태로 사용하는 방법을 떠올려보자. 근데 이거 떠올리지 않더라도 (string의 이름)= ""; 형태로 작성하는것을 이용해서 작성해도 좋을것 같다.
둘 다 기억해보고, 어떤것 하나라도 떠올려서 작성하도록 하자.
그리고 여기서, unordered_map과 map의 차이점에 대해서 알아야 하는데,
C++ unordered_map VS map 컨테이너 차이는...?
알고리즘 문제를 풀다 C++에서 hash table 용도로 활용하는 map 컨테이너에 대한 궁금증이 생겨 찾아보았다.일반적으로, 나의 경우 map 컨테이너를 주로 사용하는데 어떤 코드에서는 unordered_map 컨테
velog.io
위와 같은 블로그 글을 통해서 정보를 얻어보는것도 좋을것 같고,
혹은 gpt에 질문해서 얻을 수 있는 답변을 보자면,
`unordered_map`과 `map`은 C++의 STL(Standard Template Library)에서 제공하는 두 가지 주요
컨테이너 중 하나입니다. 이 두 컨테이너의 주요 차이점은 데이터 구조와 성능에 관련됩니다.
1. **데이터 저장 방식**:
- `map`: `map`은 데이터를 정렬된 순서로 저장합니다. 이진 검색 트리 (Binary Search Tree) 형태로
데이터를 저장하며, 키(Key)를 기반으로 정렬됩니다.
- `unordered_map`: `unordered_map`은 해시 테이블 (Hash Table) 형태로 데이터를 저장합니다.
키(Key)를 해시 함수를 사용하여 저장하고 검색합니다. 따라서 순서가 정렬되어 있지 않습니다.
2. **검색 및 삽입 성능**:
- `map`: 데이터가 정렬된 순서로 저장되므로, 검색 연산 (키(Key)를 기반으로 검색) 및 삽입
연산이 O(log n)의 시간 복잡도를 가집니다.
- `unordered_map`: 해시 테이블을 사용하므로 검색 및 삽입 연산이 일반적으로 상수 시간 O(1)에
가깝습니다. 하지만 해시 충돌(Collision)이 발생할 경우 성능이 감소할 수 있습니다.
3. **정렬**:
- `map`: 데이터가 정렬되어 있으므로, 범위 기반의 반복(iteration)을 수행할 때 정렬된 순서대로
데이터에 접근할 수 있습니다.
- `unordered_map`: 데이터가 정렬되어 있지 않으므로, 순서가 중요한 경우에는 사용하기 어렵습니다.
4. **메모리 사용량**:
- `map` 및 `unordered_map` 모두 해시 테이블에 필요한 버킷(bucket) 또는 노드(node)를
저장하기 위해 메모리를 사용합니다. 그러나 해시 테이블의 크기와 로드 팩터(load factor)에 따라
메모리 사용량이 달라집니다.
5. **동등성 비교**:
- `map`은 키(Key)의 동등성을 비교할 때 사용자 정의 비교 함수를 통해 수행할 수 있습니다.
- `unordered_map`은 해시 함수와 동등성 비교 함수를 통해 키(Key)의 동등성을 비교할 수 있습니다.
따라서 `map`은 정렬된 데이터를 필요로 하고 검색 및 삽입 성능이 중요한 경우에 적합하며,
`unordered_map`은 검색 및 삽입 연산을 빠르게 수행하고 순서가 중요하지 않은 경우에 적합합니다.
선택은 사용 사례 및 성능 요구 사항에 따라 달라집니다.
이와 같은 답을 얻을 수 있었다.
내가 보기에 이 문제의 경우는 정렬을 시킬 필요가 없다고 생각되어서 map보다는 unordered_map을 사용하는게 더 낫지 않을까 싶은데,
다른 사람의 풀이를 볼때 unordered_map 보다는 map을 사용한 풀이가 많이 보인다. 한번 더욱 경우들을 따져서 어떤 경우에 어떤 컨테이너가 적합한지 잘 고려해보도록 하자.
++++++++++++++++++++
<unordered_map 으로 선언시>
테스트 1 〉 통과 (0.02ms, 3.68MB)
테스트 2 〉 통과 (0.02ms, 4.21MB)
테스트 3 〉 통과 (0.04ms, 3.64MB)
테스트 4 〉 통과 (0.02ms, 4.21MB)
테스트 5 〉 통과 (0.02ms, 4.22MB)
테스트 6 〉 통과 (0.02ms, 3.68MB)
테스트 7 〉 통과 (0.02ms, 4.16MB)
<map 으로 선언시>
테스트 1 〉 통과 (0.03ms, 3.6MB)
테스트 2 〉 통과 (0.03ms, 4.15MB)
테스트 3 〉 통과 (0.02ms, 4.21MB)
테스트 4 〉 통과 (0.02ms, 3.68MB)
테스트 5 〉 통과 (0.02ms, 3.67MB)
테스트 6 〉 통과 (0.03ms, 4.16MB)
테스트 7 〉 통과 (0.03ms, 4.27MB)
더욱 검색해보다가, unordered_map과 map의 비교에서, 정렬되어야 하는 상황이 아니라면 모든 면에서 unordered_map이 낫다는 형태로 글을 작성하신 분이 있고, 해당 글에 레퍼런스가 있어서 그 글을 첨부해봄. 다시 읽어보면 도움이 될듯
'알고리즘 > 프로그래머스' 카테고리의 다른 글
Lv 0. 구슬을 나누는 경우의 수 *다시 풀어보기* (0) | 2023.09.19 |
---|---|
Lv 0. 가위 바위 보 (0) | 2023.09.19 |
Lv 0. 개미 군단 (0) | 2023.09.19 |
Lv 0. 외계행성의 나이 - 숫자를 string으로 바꾸고 싶으면? to_string() (0) | 2023.09.18 |
Lv 0. 순서쌍의 개수 - 처음으로 시간초과 발생한 문제. (0) | 2023.09.18 |