- 관련 사이트: https://school.programmers.co.kr/learn/courses/30/lessons/120838
"머쓱이는 친구에게 모스부호를 이용한 편지를 받았습니다. 그냥은 읽을 수 없어 이를 해독하는 프로그램을 만들려고 합니다. 문자열 letter가 매개변수로 주어질 때, letter를 영어 소문자로 바꾼 문자열을 return 하도록 solution 함수를 완성해보세요."
모스부호와 동일한 순서 (index)의 문자를 매칭시켜주면 되는 문제이다.
단, 모스부호로 이루어진 문장은 연속된 하나의 문장으로 입력되고 각각의 모스부호 값은 공백으로 구분되므로 이를 잘 변환시킬 수 있도록 해야 한다.
1) 입력된 문자열을 한 문자씩 확인
2) 공백이 들어올 때까지 문자 연속으로 저장
3) 저장된 문자열을 모스부호와 비교하여 해당되는 알파벳으로 변환
#include <string>
#include <vector>
using namespace std;
const vector<string> morse = {
".-", "-...", "-.-.", "-..", ".",
"..-.", "--.", "....", "..", ".---",
"-.-", ".-..", "--", "-.", "---",
".--.", "--.-", ".-.", "...", "-",
"..-", "...-", ".--", "-..-", "-.--",
"--.."
};
char getAlpha(string str)
{
int idx = 0;
for (; idx < morse.size(); idx++)
{
if (str == morse[idx])
break;
}
return char(idx + 97);
}
string solution(string letter) {
string answer = "";
string str = "";
for (char l : letter)
{
if (l == ' ')
{
answer += getAlpha(str);
str = "";
}
else
{
str += l;
}
}
answer += getAlpha(str);
return answer;
}
알파벳으로의 변환을 해주는 방법은 여러가지가 있다.
위의 코드에서는 직접 ASCII 코드 값으로 변환해주는 방법을 사용하였으며,
아래의 코드에서는 모스부호 값을 저장해놓을 때 map의 형식을 사용해줌으로써 검색을 용이하도록 하였다.
추가적으로, 위의 코드에서 모든 for 문 종료 후 다시 str 값을 비교하는 것이 아닌,
아래와 같이 for 문에서 확인할 문자열의 끝에 빈 공백을 추가해주면 한 번에 동일 로직을 수행해줄 수 있다.
#include <string>
#include <map>
using namespace std;
const map<string, char> 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 solution(string letter) {
string answer = "";
string str = "";
for (char l : letter + " ")
{
if (l == ' ')
{
answer += morse.find(str)->second;
str = "";
}
else
{
str += l;
}
}
return answer;
}
여기서 더 간단히 하자면, 문자를 하나씩 확인하여 공백을 구분하는 것이 아닌
stringstream을 사용하여 모든 문자열을 입력받은 뒤 이를 공백으로 구분하여 다시 문자열로 입력받도록 할 수도 있다.
#include <sstream>
#include <string>
#include <map>
using namespace std;
const map<string, char> 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 solution(string letter) {
string answer = "";
string str = "";
stringstream ss(letter);
while (!ss.eof())
{
ss >> str;
answer += morse.find(str)->second;
}
return answer;
}
'Algorithm > Programers' 카테고리의 다른 글
피자 나눠 먹기 (2) (0) | 2023.06.06 |
---|---|
피자 나눠 먹기 (1) (0) | 2023.06.06 |
자릿수 더하기 (0) | 2023.06.06 |
A로 B 만들기 (0) | 2023.06.05 |
세균 증식 (0) | 2023.06.05 |
댓글