[c++ 프로그래머스] (Lv.3) 110 옮기기

728x90
  • 110 옮기기

문제 설명

0과 1로 이루어진 어떤 문자열 x에 대해서, 당신은 다음과 같은 행동을 통해 x를 최대한 사전 순으로 앞에 오도록 만들고자 합니다.

  • x에 있는 "110"을 뽑아서, 임의의 위치에 다시 삽입합니다.

예를 들어, x = "11100" 일 때, 여기서 중앙에 있는 "110"을 뽑으면 x = "10" 이 됩니다. 뽑았던 "110"을 x의 맨 앞에 다시 삽입하면 x = "11010" 이 됩니다.

변형시킬 문자열 x가 여러 개 들어있는 문자열 배열 s가 주어졌을 때, 각 문자열에 대해서 위의 행동으로 변형해서 만들 수 있는 문자열 중 사전 순으로 가장 앞에 오는 문자열을 배열에 담아 return 하도록 solution 함수를 완성해주세요.


제한사항
  • 1 ≤ s의 길이 ≤ 1,000,000
  • 1 ≤ s의 각 원소 길이 ≤ 1,000,000
  • 1 ≤ s의 모든 원소의 길이의 합 ≤ 1,000,000

입출력 예sresult
["1110","100111100","0111111010"] ["1101","100110110","0110110111"]

입출력 예 설명

입출력 예 #1

  • 다음 그림은 "1110"을 "1101"로 만드는 과정을 나타낸 것입니다.
  • "1101"보다 사전 순으로 더 앞에 오는 문자열을 만들 수 없으므로, 배열에 "1101"을 담아야 합니다.
  • 다음 그림은 "100111100"을 "100110110"으로 만드는 과정을 나타낸 것입니다.
  • "100110110"보다 사전 순으로 더 앞에 오는 문자열을 만들 수 없으므로, 배열에 "100110110"을 담아야 합니다.
  • 그림에 나온 방식 말고도 다른 방법으로 "100110110"을 만들 수 있습니다.
  • 다음 그림은 "0111111010"을 "0110110111"로 만드는 과정을 나타낸 것입니다.
  • "0110110111"보다 사전 순으로 더 앞에 오는 문자열을 만들 수 없으므로, 배열에 "0110110111"을 담아야 합니다.
  • 그림에 나온 방식 말고도 다른 방법으로 "0110110111"을 만들 수 있습니다.

풀이과정

 

1. 풀다가 안 풀려서 다른 사람들의 풀이를 참고하여 해결하였습니다.

2. 문자열을 탐색하여 "110"을 찾은 뒤 제거하고 나중에 더하기 위해 제거한 만큼 Count를 새었습니다.

3. 문자열 "110" 이 제거가 된 문자열에서 사전 순으로 앞에 오는 문자열을 만들기 위해 뒤에서부터 '0' 이 나오는 위치를 찾았습니다.

4. 그 위치에 제거한 Count 만큼 "110"을 더해 주었습니다.

 


코드
#include <string>
#include <vector>

using namespace std;

vector<string> solution(vector<string> s) {
    vector<string> answer;
    for(auto one : s)
    {
        int addCount = 0;
        string temp = "";
        for(int i = 0; i < one.size(); i++)
        {
            temp += one[i];
            if(temp.size() >= 3 && temp.substr(temp.size() - 3) == "110" )
            {
                addCount++;
                temp.erase(temp.size() - 3,3);
            } 
        }
        int i;
        for(i = temp.size() - 1; i >= 0 ; i--)
        {
            if (temp[i] == '0')
            {
                break;
            }
        }
        for(int j = 0 ; j < addCount; j++)
        {
            temp.insert(i+1,"110");
        }
        answer.push_back(temp);
    }
    return answer;
}
728x90