-
프로그래머스 - [3차] 압축 [C++]문제 풀이/프로그래머스 2023. 8. 26. 11:39반응형
이 문제는 맵을 이용한 구현 문제이다. 문제에 주어진 설명 그대로 구현하면 바로 시간 초과 없이 정답이 나온다. 왜냐하면 msg에 대해 루프를 돌리는데 사전에 없는 단어가 나올때의 그 문자부터 시작하므로 결국 O(N) 시간이 걸리고, msg의 최대 길이가 1,000 밖에 되지 않기 때문이다.
이 문제를 풀기 위해 다음과 같은 수도 코드를 작성하였다.
temp += msg[index] 만약 dic[temp] == 0이라면 // 사전에 없음 answer에 dic[prev] 추가 dic[temp] = pushIndex pushIndex++ index-- temp = "" prev = "" 0이 아니라면 // 사전에 있음 prev = temp; continue index++
처음에는 while문 안에 for문이 있어 그 안에 저 수도코드가 동작하도록 구현했지만, 생각해보니 굳이 그럴 필요가 없었고 애초에 정답도 안 나온다. 단일 반복문만으로 충분히 해결 가능한 로직이었다.
한 가지 유의할 점은 루프가 끝나고 나면 마지막 문자열이 temp에 남아있게 되는데, 남아있는 문자열은 반드시 사전에 존재하는 단어이다. KAKAO 를 예시로 들었을 때, KAKA 까지 수행하고 O를 검사하게 되는데, 이는 단일 문자이므로 반드시 사전에 존재한다. 또한 TOBEORNOTTOBEORTOBEORNOT 를 예시로 들어도, 마지막에 OT 가 남게 되는데 이는 첫번째 분기문에서 걸리지 않았기 때문에 이렇게 유지되는 것이다. 따라서 반드시 남아있는 문자열은 사전에 존재하는 단어가 되므로 answer에 push 해주면 정답이 나오게 된다.
#include <string> #include <vector> #include <map> #include <iostream> using namespace std; vector<int> solution(string msg) { vector<int> answer; map<string, int> dictionary; for (int i = 1; i <= 26; i++) { string temp = ""; temp += 'A' + (i - 1); dictionary[temp] = i; } // base case if (msg.size() == 1) { string temp = ""; temp += msg[0]; answer.push_back(dictionary[temp]); return answer; } int pushIndex = 27; int index = 0; string temp = ""; string prev = ""; while (index < msg.size()) { temp += msg[index]; if (dictionary[temp] == 0) { answer.push_back(dictionary[prev]); dictionary[temp] = pushIndex; pushIndex++; temp = ""; prev = ""; index--; } else { prev = temp; } index++; } answer.push_back(dictionary[temp]); return answer; }
반응형'문제 풀이 > 프로그래머스' 카테고리의 다른 글
프로그래머스 - 주차 요금 계산 [C++] (0) 2023.08.28 프로그래머스 - [3차] n진수 게임 [C++] (0) 2023.08.28 프로그래머스 - n^2 배열 자르기 [C++] (0) 2023.08.25 프로그래머스 - 줄 서는 방법 [C++] (0) 2023.08.24 프로그래머스 - 무인도 여행 [C++] (0) 2023.08.24