프로그래머스/Lv.2
[C++] 프로그래머스 [3차] 압축
MINU.SHINNNN
2023. 10. 9. 17:27
https://school.programmers.co.kr/learn/courses/30/lessons/17684
프로그래머스
코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.
programmers.co.kr
풀이
주어진 문자열 msg를 압축하는데 주어진 조건
- 사전에 존재하는 가장 긴 문자열 w 찾기
- w 색인 번호를 answer에 넣고 w를 msg에서 제거하기
- 입력에서 처리되지 않은 다음 글자 c가 존재한다면 w+c에 해당하는 단어를 사전에 등록
해야 하는 문제입니다.
unordered_map 자료구조(dict 변수)를 사용해 알파벳 순으로 먼저 사전을 초기화해주었습니다.
다음 for 문과 while 문에서는 사전에 존재하는 가장 긴 문자열 w (str_w 변수) 를 찾습니다. 이때 사전 dict 에 존재하지 않는다면 새로 등록해야 하는 w+c에 해당합니다.
따라서, w+c를 먼저 사전에 등록해주고 substr()을 사용해 바로 직전 문자에 해당하는 색인을 answer에 추가합니다.
2번 조건은 i += str_w.size()를 사용해 w에 해당하는 길이만큼 건너띄어 줍니다.
마지막 문자에 도달 후 다음은 공백 문자를 추가하므로 if 문에 들어가서 문제없이 정답을 추가한 후 for 문이 종료됩니다.
#include <string>
#include <vector>
#include <unordered_map>
#include <iostream>
using namespace std;
unordered_map<string, int> dict;
string s[] = {"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"};
vector<int> solution(string msg) {
vector<int> answer;
int num_cnt = 26;
for (int i = 0; i < num_cnt; i++) {
dict[s[i]] = i+1;
}
string str_w;
for (int i = 0; i < msg.size(); ) {
// w 찾기
int j = i;
while (true) {
str_w += msg[j];
if (dict[str_w] == 0) {
// 사전에 없는 경우
dict[str_w] = ++num_cnt; // w+c 등록
str_w = str_w.substr(0, j-i);
answer.push_back(dict[str_w]); // 출력
i += str_w.size();
str_w = ""; // 초기화
break;
}
j++;
}
}
return answer;
}