ํ‹ฐ์Šคํ† ๋ฆฌ ๋ทฐ

๋ฌธ์ œ

์ฐฝ์˜์ด๋Š” ๊ฐ•์‚ฐ์ด์˜ ๋น„๋ฐ€๋ฒˆํ˜ธ๋ฅผ ํ›”์น˜๊ธฐ ์œ„ํ•ด์„œ ๊ฐ•์‚ฐ์ด๊ฐ€ ์‚ฌ์šฉํ•˜๋Š” ์ปดํ“จํ„ฐ์— ํ‚ค๋กœ๊ฑฐ๋ฅผ ์„ค์น˜ํ–ˆ๋‹ค. ๋ฉฐ์น ์„ ๊ธฐ๋‹ค๋ฆฐ ๋์— ์ฐฝ์˜์ด๋Š” ๊ฐ•์‚ฐ์ด๊ฐ€ ๋น„๋ฐ€๋ฒˆํ˜ธ ์ฐฝ์— ์ž…๋ ฅํ•˜๋Š” ๊ธ€์ž๋ฅผ ์–ป์–ด๋ƒˆ๋‹ค.

ํ‚ค๋กœ๊ฑฐ๋Š” ์‚ฌ์šฉ์ž๊ฐ€ ํ‚ค๋ณด๋“œ๋ฅผ ๋ˆ„๋ฅธ ๋ช…๋ น์„ ๋ชจ๋‘ ๊ธฐ๋กํ•œ๋‹ค. ๋”ฐ๋ผ์„œ, ๊ฐ•์‚ฐ์ด๊ฐ€ ๋น„๋ฐ€๋ฒˆํ˜ธ๋ฅผ ์ž…๋ ฅํ•  ๋•Œ, ํ™”์‚ดํ‘œ๋‚˜ ๋ฐฑ์ŠคํŽ˜์ด์Šค๋ฅผ ์ž…๋ ฅํ•ด๋„ ์ •ํ™•ํ•œ ๋น„๋ฐ€๋ฒˆํ˜ธ๋ฅผ ์•Œ์•„๋‚ผ ์ˆ˜ ์žˆ๋‹ค. 

๊ฐ•์‚ฐ์ด๊ฐ€ ๋น„๋ฐ€๋ฒˆํ˜ธ ์ฐฝ์—์„œ ์ž…๋ ฅํ•œ ํ‚ค๊ฐ€ ์ฃผ์–ด์กŒ์„ ๋•Œ, ๊ฐ•์‚ฐ์ด์˜ ๋น„๋ฐ€๋ฒˆํ˜ธ๋ฅผ ์•Œ์•„๋‚ด๋Š” ํ”„๋กœ๊ทธ๋žจ์„ ์ž‘์„ฑํ•˜์‹œ์˜ค. ๊ฐ•์‚ฐ์ด๋Š” ํ‚ค๋ณด๋“œ๋กœ ์ž…๋ ฅํ•œ ํ‚ค๋Š” ์•ŒํŒŒ๋ฒณ ๋Œ€๋ฌธ์ž, ์†Œ๋ฌธ์ž, ์ˆซ์ž, ๋ฐฑ์ŠคํŽ˜์ด์Šค, ํ™”์‚ดํ‘œ์ด๋‹ค.

 

<๋ฌธ์ œ ๋งํฌ>

 

5397๋ฒˆ: ํ‚ค๋กœ๊ฑฐ

์ฒซ์งธ ์ค„์— ํ…Œ์ŠคํŠธ ์ผ€์ด์Šค์˜ ๊ฐœ์ˆ˜๊ฐ€ ์ฃผ์–ด์ง„๋‹ค. ๊ฐ ํ…Œ์ŠคํŠธ ์ผ€์ด์Šค๋Š” ํ•œ์ค„๋กœ ์ด๋ฃจ์–ด์ ธ ์žˆ๊ณ , ๊ฐ•์‚ฐ์ด๊ฐ€ ์ž…๋ ฅํ•œ ์ˆœ์„œ๋Œ€๋กœ ๊ธธ์ด๊ฐ€ L์ธ ๋ฌธ์ž์—ด์ด ์ฃผ์–ด์ง„๋‹ค. (1 ≤ L ≤ 1,000,000) ๊ฐ•์‚ฐ์ด๊ฐ€ ๋ฐฑ์ŠคํŽ˜์ด์Šค๋ฅผ ์ž…

www.acmicpc.net


์ž…๋ ฅ

์ฒซ์งธ ์ค„์— ํ…Œ์ŠคํŠธ ์ผ€์ด์Šค์˜ ๊ฐœ์ˆ˜๊ฐ€ ์ฃผ์–ด์ง„๋‹ค. ๊ฐ ํ…Œ์ŠคํŠธ ์ผ€์ด์Šค๋Š” ํ•œ์ค„๋กœ ์ด๋ฃจ์–ด์ ธ ์žˆ๊ณ , ๊ฐ•์‚ฐ์ด๊ฐ€ ์ž…๋ ฅํ•œ ์ˆœ์„œ๋Œ€๋กœ ๊ธธ์ด๊ฐ€ L์ธ ๋ฌธ์ž์—ด์ด ์ฃผ์–ด์ง„๋‹ค. (1 ≤ L ≤ 1,000,000) ๊ฐ•์‚ฐ์ด๊ฐ€ ๋ฐฑ์ŠคํŽ˜์ด์Šค๋ฅผ ์ž…๋ ฅํ–ˆ๋‹ค๋ฉด, '-'๊ฐ€ ์ฃผ์–ด์ง„๋‹ค. ์ด๋•Œ ์ปค์„œ์˜ ๋ฐ”๋กœ ์•ž์— ๊ธ€์ž๊ฐ€ ์กด์žฌํ•œ๋‹ค๋ฉด, ๊ทธ ๊ธ€์ž๋ฅผ ์ง€์šด๋‹ค. ํ™”์‚ดํ‘œ์˜ ์ž…๋ ฅ์€ '<'์™€ '>'๋กœ ์ฃผ์–ด์ง„๋‹ค. ์ด๋•Œ๋Š” ์ปค์„œ์˜ ์œ„์น˜๋ฅผ ์›€์ง์ผ ์ˆ˜ ์žˆ๋‹ค๋ฉด, ์™ผ์ชฝ ๋˜๋Š” ์˜ค๋ฅธ์ชฝ์œผ๋กœ 1๋งŒํผ ์›€์ง์ธ๋‹ค. ๋‚˜๋จธ์ง€ ๋ฌธ์ž๋Š” ๋น„๋ฐ€๋ฒˆํ˜ธ์˜ ์ผ๋ถ€์ด๋‹ค. ๋ฌผ๋ก , ๋‚˜์ค‘์— ๋ฐฑ์ŠคํŽ˜์ด์Šค๋ฅผ ํ†ตํ•ด์„œ ์ง€์šธ ์ˆ˜๋Š” ์žˆ๋‹ค. ๋งŒ์•ฝ ์ปค์„œ์˜ ์œ„์น˜๊ฐ€ ์ค„์˜ ๋งˆ์ง€๋ง‰์ด ์•„๋‹ˆ๋ผ๋ฉด, ์ปค์„œ ๋ฐ ์ปค์„œ ์˜ค๋ฅธ์ชฝ์— ์žˆ๋Š” ๋ชจ๋“  ๋ฌธ์ž๋Š” ์˜ค๋ฅธ์ชฝ์œผ๋กœ ํ•œ ์นธ ์ด๋™ํ•œ๋‹ค.


์ถœ๋ ฅ

๊ฐ ํ…Œ์ŠคํŠธ ์ผ€์ด์Šค์— ๋Œ€ํ•ด์„œ, ๊ฐ•์‚ฐ์ด์˜ ๋น„๋ฐ€๋ฒˆํ˜ธ๋ฅผ ์ถœ๋ ฅํ•œ๋‹ค. ๋น„๋ฐ€๋ฒˆํ˜ธ์˜ ๊ธธ์ด๋Š” ํ•ญ์ƒ 0๋ณด๋‹ค ํฌ๋‹ค.


๋ฌธ์ œ ํ’€์ด

์ด๋ฒˆ ๋ฌธ์ œ๋Š” ๋ฌธ์ž ์—๋””ํ„ฐ์™€ ๊ฐ™์€ ๊ธฐ๋Šฅ์„ ํ•˜๋Š” ์ฝ”๋“œ๋ฅผ ์ž‘์„ฑํ•˜๋Š” ๋ฌธ์ œ์ž…๋‹ˆ๋‹ค. 

ํ’€์ด๋กœ๋Š” Swift ์ฝ”๋“œ์—์„œ๋Š” ๋‘ ๊ฐœ์˜ ๋ฐฐ์—ด์„ ์‚ฌ์šฉํ•˜์˜€๊ณ , C++ ์ฝ”๋“œ์—์„œ๋Š” ์—ฐ๊ฒฐ ๋ฆฌ์ŠคํŠธ๋ฅผ ํ™œ์šฉํ•˜์—ฌ ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ–ˆ์Šต๋‹ˆ๋‹ค.

 

<swift>

๋ฐฐ์—ด์„ ์ด์šฉํ•  ๊ฒฝ์šฐ ์ฃผ์˜ํ•  ์ ์€ '<' ์ฒ˜๋ฆฌ ๋ถ€๋ถ„์—์„œ๋Š” leftArr์˜ ๋งˆ์ง€๋ง‰ ์š”์†Œ๋ฅผ rightArr๋กœ ์˜ฎ๊ฒจ์ฃผ๊ณ , '>' ์ฒ˜๋ฆฌ ๋ถ€๋ถ„์—์„œ๋Š” ๋ฐ˜๋Œ€๋กœ rightArr์˜ ๋งˆ์ง€๋ง‰ ์š”์†Œ๋ฅผ leftArr๋กœ ์˜ฎ๊ฒจ์ฃผ๋ฉด ๋ฉ๋‹ˆ๋‹ค. ์ด์™€ ๊ฐ™์€ ๊ธฐ๋Šฅ์€ ์Šคํƒ์„ ์ด์šฉํ•  ์ˆ˜๋„ ์žˆ๊ณ , ๋‹จ์ˆœํžˆ ๋ฐฐ์—ด์„ ์ƒ์„ฑํ•˜์—ฌ ๋ฉ”์„œ๋“œ๋ฅผ ์ด์šฉํ•  ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค.

 

๋˜ํ•œ, ๊ณ„์†ํ•ด์„œ ๋ฐฐ์—ด์˜ ๋งˆ์ง€๋ง‰ ๋ฐ์ดํ„ฐ๋งŒ์„ ํ™œ์šฉํ•˜๊ธฐ ๋•Œ๋ฌธ์— ๋ฒ”์œ„๋ฅผ ๋ฒ—์–ด๋‚˜๋Š” ์ ‘๊ทผ์€ ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ๋นˆ ๋ฐฐ์—ด์ผ ๋•Œ๋ฅผ ์ฒ˜๋ฆฌํ•˜๋Š” ๋ฐฉ๋ฒ•์œผ๋กœ๋Š” isEmpty๋กœ ํ™•์ธํ•˜๋Š” ๋ฐฉ๋ฒ•๊ณผ ์˜ต์…”๋„ ํƒ€์ž…์„ ๋ฆฌํ„ดํ•ด์ฃผ๋Š” popLast ๋ฉ”์„œ๋“œ๋ฅผ ํ™œ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

 

<cpp>

์—ฐ๊ฒฐ ๋ฆฌ์ŠคํŠธ๋ฅผ ์‚ฌ์šฉํ•  ๋•Œ ์ฃผ์˜ํ•  ์ ์€ iterator๊ฐ€ ๋ฆฌ์ŠคํŠธ์˜ ๋ฒ”์œ„๋ฅผ ๋ฒ—์–ด๋‚˜๋Š” ์ƒํ™ฉ์„ ๋งŒ๋“ค์ง€ ์•Š๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.

๋ฆฌ์ŠคํŠธ์— ๋ฐ์ดํ„ฐ๋ฅผ ์ถ”๊ฐ€ํ•˜๊ธฐ ์ „์— L.begin()์„ ์ €์žฅํ•œ ๋’ค, ์ปค์„œ๊ฐ€ ๋ฒ”์œ„๋ฅผ ๋ฒ—์–ด๋‚˜๋Š”์ง€ ๊ณ„์† ํ™•์ธํ•ด์ค๋‹ˆ๋‹ค.

 

(๋นˆ ๋ฆฌ์ŠคํŠธ์—์„œ L.begin()๊ณผ L.end()๋Š” ๊ฐ™์€ ๊ฐ’์„ ๊ฐ€์ง‘๋‹ˆ๋‹ค. ๋˜ํ•œ, insert๋ฅผ ํ•˜๋ฉด ํ•ด๋‹น iter ์•ž์ชฝ์œผ๋กœ ๋ฐ์ดํ„ฐ๊ฐ€ ์ €์žฅ๋˜๊ธฐ ๋•Œ๋ฌธ์— ์ฒ˜์Œ์— ์ €์žฅํ•œ begin ๊ฐ’์€ ๊ณ„์†ํ•ด์„œ ๋ฆฌ์ŠคํŠธ์˜ ๋งˆ์ง€๋ง‰ ์ธ๋ฑ์Šค๋ฅผ ๊ฐ€๋ฆฌํ‚ต๋‹ˆ๋‹ค.)

ํ’€์ด ์ˆœ์„œ

1. Swift์˜ ๊ฒฝ์šฐ ๋‘ ๊ฐœ์˜ ๋ฐฐ์—ด์„ ๋งŒ๋“ค์–ด์ฃผ๊ณ , C++์˜ ๊ฒฝ์šฐ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์—์„œ ์ง€์›ํ•ด์ฃผ๋Š” List๋ฅผ ์ •์˜ํ•ด์ค๋‹ˆ๋‹ค.

2. ๋ฌธ์ œ์—์„œ ์š”๊ตฌํ•˜๋Š” ๊ฐ’์„ ์กฐ๊ฑด์— ๋งž๊ฒŒ ์ €์žฅํ•ด์ค๋‹ˆ๋‹ค.

3. ์กฐ๊ฑด์— ๋งž๊ฒŒ ์ €์žฅ๋œ ๊ฐ’์„ ์ถœ๋ ฅํ•ด์ค๋‹ˆ๋‹ค.


ํ’€์ด ์ฝ”๋“œ

< Swift>

// Swift
// ํ’€์ด 1: ๋‘ ๊ฐœ์˜ ๋ฐฐ์—ด ์ด์šฉ (๋ฌธ์ž์—ด๋กœ๋„ ๊ฐ€๋Šฅ)
func solve(_ str: String) {
    
    var leftArr = [Character]()
    var rightArr = [Character]()
    
    for char in str {
        if char == "<" {
//            if let last = leftArr.popLast() {
//                rightArr.append(last)
//            }
            // ์ด ์ฝ”๋“œ๊ฐ€ ๋ฏธ์„ธํ•˜๊ฒŒ ๋น ๋ฆ„
            if !leftArr.isEmpty {
                rightArr.append(leftArr.removeLast())
            }
        } else if char == ">" {
//            if let last = rightArr.popLast() {
//                leftArr.append(last)
//            }
            if !rightArr.isEmpty {
                leftArr.append(rightArr.removeLast())
            }
        } else if char == "-" {
            let _ = leftArr.popLast()
        } else { // ๋ฌธ์ž ์ž…๋ ฅ
            leftArr.append(char)
        }
    }
    
    print(String(leftArr) + String(rightArr.reversed()))
}

< C++>

// C++
#include <bits/stdc++.h>
using namespace std;

// ํ’€์ด 2: ์—ฐ๊ฒฐ ๋ฆฌ์ŠคํŠธ ํ™œ์šฉ
int main(){
    ios::sync_with_stdio(0);
    cin.tie(0);
    
    int n;
    cin >> n;
    
    while(n--){
        list<char> L = {};
        
        auto iter = L.begin();  // ์ปค์„œ
        
        string cmd;
        cin >> cmd;
        
        for(auto c : cmd){  // ๋นˆ ๋ฆฌ์ŠคํŠธ์ผ ๊ฒฝ์šฐ, begin()๊ณผ end()๋Š” ๊ฐ™์€ ๊ฐ’
            if(c == '>'){
                if(iter != L.end()) iter++;
            }
            else if(c == '<'){
                if(iter != L.begin()) iter--;
            }
            else if(c == '-'){
                if(iter != L.begin()){
                    iter--;
                    iter = L.erase(iter);  // iter๊ฐ€ erase๋˜๋ฉด์„œ ๋‹ค์Œ ๊ฐ’์˜ iter๋ฅผ ๋ฆฌํ„ด
                }
            }
            else{
                L.insert(iter, c);  // inter ์•ž์— c๋ฅผ ์ถ”๊ฐ€
            }
        }
        
        for(auto c : L) cout << c;
        cout << '\n';
        
    }
    
}

 


๋งˆ๋ฌด๋ฆฌ

์ด๋ฒˆ ๋ฌธ์ œ์—์„œ๋Š” stack์„ ์™„์ „ํžˆ ๊ตฌํ˜„ํ•˜์ง€ ์•Š๊ณ  ๋ฉ”์„œ๋“œ๋งŒ์„ ์ด์šฉํ•˜์—ฌ ๊ฐœ๋…์ ์œผ๋กœ๋งŒ ์ ‘๊ทผํ–ˆ์Šต๋‹ˆ๋‹ค. 

 

๋˜ํ•œ, Swift์˜ removeLast()๋Š” @discardableResult๋ฅผ ์ด์šฉํ•œ๋‹ค๋Š” ๊ฒƒ์„ ์•Œ๊ฒŒ ๋˜์—ˆ์Šต๋‹ˆ๋‹ค. 

(popLast()์˜ ๋ฆฌํ„ด ํƒ€์ž…์ด ์˜ต์…”๋„์ด๋ผ ๋นˆ ๋ฐฐ์—ด์„ ์˜ˆ์™ธ์ฒ˜๋ฆฌํ•  ๋•Œ ์ž์ฃผ ์‚ฌ์šฉํ•˜์˜€๋Š”๋ฐ, ํ•ด๋‹น ๋ฉ”์„œ๋“œ๋Š” @discardableResult๋ฅผ ์ฑ„ํƒํ•˜๊ณ  ์žˆ์ง€ ์•Š์Šต๋‹ˆ๋‹ค.) 

 

C++ ์ฝ”๋“œ๋ฅผ ์ž‘์„ฑํ•˜๋ฉด์„œ iterator ๊ฐœ๋…์— ๋Œ€ํ•ด์„œ ์ฐพ์•„๋ณด๊ฒŒ ๋˜์—ˆ๊ณ , ๋ฉ”๋ชจ๋ฆฌ ์ฃผ์†Œ์— ๋Œ€ํ•ด ์กฐ๊ธˆ์€ ๋” ์นœ์ˆ™ํ•ด์ง„ ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค. ์ดํ›„์—๋Š” Swift์˜ iterator protocol๊ณผ sequence์— ๋Œ€ํ•ด์„œ๋„ ๋” ํŒŒ๊ณ ๋“ค๋ฉด ์ข‹์„ ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค.