알고리즘/프로그래머스

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

lheunoia 2023. 4. 12. 17:45

 

 

 

 

 

https://school.programmers.co.kr/learn/courses/30/lessons/77886?language=cpp 

 

프로그래머스

코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.

programmers.co.kr

 

이번 문제는 월간 코드 챌린지 시즌2 문제였습니다.

 

 

 

 

 

📝 문제 풀이

1. 문자열 str에서 110"을 모두 제거하고 acc 문자열에 삽입 (ex. acc = "110110110 ...")

2. "110"이 제거된 문자열에서 가장 뒤에 있는 0의 인덱스 찾기

  • 가장 뒤에 있는 0의 인덱스를 찾지 못했다면 (1로만 이루어져 있으면) 문자열 앞에 acc 삽입
  • 찾았다면 가장 뒤에 있는 0의 인덱스 뒤에 acc 삽입

 

 

 

 

👩🏻‍💻 C++ 코드

#include <string>
#include <vector>

using namespace std;

vector<string> solution(vector<string> s) {
    vector<string> answer;
    
    for (auto str: s) {
        string acc = ""; // 문자열의 "110" 개수만큼 "110" 더하기
        string tmp = "";
        
        for (int i=0; i<str.length(); i++) {
            tmp += str[i];
            
            if (tmp.length() >= 3) {
                if (tmp.substr(tmp.length()-3, 3) == "110") {
                    tmp.erase(tmp.length()-3, 3);
                    acc += "110";
                }    
            }
        }
        
        str = tmp;
        
        // 문자열에서 마지막 '0'의 인덱스 찾기
        int lastZeroIdx = -1;
        for (int i=str.length()-1; i>=0; i--) {
            if (str[i] == '0') {
                lastZeroIdx = i;
                break;
            }
        }
        
        // 문자열이 1로만 이루어진 경우
        if (lastZeroIdx == -1) {
            str = acc + str;
        } else {
            str.insert(lastZeroIdx+1, acc);
        }
        
        answer.push_back(str);
    }
    
    return answer;
}

 

프로그래머스 - 결과 화면

 

 

 

 

 

반응형