[프로그래머스] 표 편집(C++)

갭라·2021년 8월 28일
1

문제 링크 - 표 편집

🤔문제 해석

'U','D'가 입력되면 뒤에 나오는 수만큼 커서를 옮긴다.
'C'가 입력되면 해당 커서에 들어있는 값을 지우고 커서를 바로 아래로 옮긴다. 이 때, 지운 곳의 커서가 가장 아래였을 경우 지운 곳의 바로 위로 커서를 옮긴다.
'Z'가 입력되면 가장 최근에 삭제된 행을 원래돼로 복구한다. 단, 현재 커서의 위치는 바뀌지 않는다.

❗ 제한 조건

5 ≤ n ≤ 1,000
1 ≤ cmd의 원소 개수 ≤ 1,000

😏풀이

여기서 가장 중요한 것은 table을 set으로 생성하는 것이다. (set에 대한 기본 내용)
또, 지웠던 내용을 다시 되돌릴 때 필요한 hist를 stack으로 만들어둔다.
->Z가 나올 때마다 하나씩 역순으로 꺼내어 쓸 수 있도록

answer라는 문자열을 n의 크기만큼 'X'로 초기화한다.

입력으로 들어오는 cmd를 한 줄 씩 읽으며
해당 문자열의 가장 첫 문자가 'U' 또는 'D'일 때는 반복자를 사용하여 반복자의 위치를 뒤에 나오는 숫자만큼 옮기고
'C'일 때는 해당 반복자가 가리키는 곳의 값을 만들어둔 스택 hist에 저장해둔 뒤 table에서는 erase()한다.
'Z'의 경우에는 hist 스택에서 꺼내와 table에 다시 넣고 hist에서 pop()해준다.

이 때 table은 set으로 생성돼있기 때문에, 삽입을 하면 알아서 정렬된다.
이 점을 활용하여 이 문제는 처음에 'X'로 초기화해놓은 문자열 answer에서 table에 들어있는 곳의 index만 'O'로 바꿀 수 있다.

💻코드

#include <set>
#include <iterator>
#include <string>
#include <vector>
#include <stack>
using namespace std;

string solution(int n, int k, vector<string> cmd) {
    string answer(n,'X');

    set<int> table;
    stack<int> hist;
    for(int i=0;i<n;i++) table.insert(i);

    auto cur = table.find(k);

    for(string s:cmd){
        if(s[0]=='U' || s[0]=='D'){
            int x = stoi(s.substr(2));
            if(s[0]=='U') while(x--) cur = prev(cur);
            else while(x--) cur = next(cur);
        }
        else if(s[0]=='C'){
            hist.push(*cur);
            cur = table.erase(cur);
            if(cur==table.end()) cur = prev(cur);
        }
        else if(s[0]=='Z'){
            table.insert(hist.top());
            hist.pop();
        }
        else return "";
    }

    for(int i:table) answer[i]='O';

    return answer;
}
profile
준비생!

1개의 댓글

comment-user-thumbnail
2021년 11월 10일

좋은 내용 많이 얻어갑니다~!😀

답글 달기