학습(0)/C++ 문제풀이

프로.입문.모스부호1, istringstream객체

누가 뭐래도 개발자 2025. 2. 18. 01:42

1. 값을 대입하기 귀찮아서 for문 돌려 입력받았다.

 

2. 문자열 공백 기준 자르기.

  • istringstream

#include <sstream>

 

std::string input = "asdf sdf aa";

std::istringstream iss(input);

std::string word;

 

->입력받은 문자열을 스트림처럼 취급하여 공백을 기준으로 단어를 분리할 수 있도록 한다.

 

while (iss >> word)

->iss 에서 공백을 기준으로 단어를 하나씩 읽어와 word에 저장한다.

 

 

#include <sstream>
#include <string>
#include <map>

using namespace std;

string solution(string letter) {
    istringstream streamLetter(letter); //문자열 자르기 용
    string word;

    string morse[] = { ".-","-...","-.-.","-..",".","..-.","--.","....","..",".---",
        "-.-",".-..","--","-.","---",".--.","--.-",".-.","...","-","..-","...-",".--",
        "-..-","-.--","--.." };      
    map<string, char> decryption;
    map<string, char>::iterator iter;

    string answer = "";
    char c = 'a';
  
    
    //map에 페어링
    for (int i = 0; i < 26; ++i)
    {
        decryption.insert({ morse[i], c++ });
    }

    //자른 문자열인 키에 해당하는 값 찾아 answer에 붙히기.
    while (streamLetter >> word)
    {
        iter = decryption.find(word);
        answer.append(1, iter->second);
    }

    return answer;
}

 

1번에서 값을 직접 매핑시켜준게 아니라 for문을 사용한거라 미세한 속도 저하가 있을 것 같다.

 

시간 복잡도 n*m

 

  • gemini 개선

1. auto: 컴파일러가 타입 추론.

iterator에도 사용 가능하다.

for (const auto& code : morse) { // morse 배열의 각 요소에 대해 반복
    decryption.insert({code, c++});
}

// map iterator에도 auto 사용 가능
while (streamLetter >> word) {
    auto iter = decryption.find(word); // auto를 사용하여 iterator 타입 자동 추론
    if (iter != decryption.end()) {
        answer += iter->second;
    } // ...
}

 

2. append보다 +=가 일반적이다.

값이 적어서 그런듯.

 

 

3. unorderd_map 사용

정렬을 수행하지 않아 상수시간 탐색

 

4. 정적 초기화

매핑 값은 실행 중 변화하지 않기에 static으로 초기화.