[BOJ] #5430 AC (Python, Deque, ์‹œ๊ฐ„ ์ดˆ๊ณผ ํ•ด๊ฒฐ)

    ๋ฐ˜์‘ํ˜•

    ๐ŸŒฑ ๋ฌธ์ œ

    https://www.acmicpc.net/problem/5430

     

    ๐ŸŒฑ ํ’€์ด

    1. ์ž…๋ ฅ ๋ฐ›๊ธฐ

    T = int(input())
    
    for _ in range(T):
        p = input()
        p.replace("RR", "")
        p = list(p)
        n = int(input())
        array = deque(eval(input()))
    • ํ…Œ์ŠคํŠธ ์ผ€์ด์Šค ๊ฐœ์ˆ˜์ธ T๋ฅผ int๋กœ ๋ฐ›์•„์„œ ํ•ด๋‹น ๊ฐœ์ˆ˜๋งŒํผ ๋ฐ˜๋ณต๋ฌธ์„ ๋“ค์–ด๊ฐ‘๋‹ˆ๋‹ค.
    • ์ˆ˜ํ–‰ํ•ด์•ผํ•  ํ•จ์ˆ˜ p๋Š” ์šฐ์„  string์œผ๋กœ ๋ฐ›์Šต๋‹ˆ๋‹ค. ์ด๋•Œ, RR์€ ๋’ค์ง‘๊ณ  ๋ฐ”๋กœ ๋’ค์ง‘๊ธฐ ๋•Œ๋ฌธ์— ๋ฐฐ์—ด์— ์•„๋ฌด๋Ÿฐ ๋ณ€ํ™”๋ฅผ ์ฃผ์ง€ ์•Š์œผ๋ฏ€๋กœ replace()ํ•จ์ˆ˜๋กœ ๋ฐ”๋กœ ์ง€์› ์Šต๋‹ˆ๋‹ค. ๊ทธ๋ฆฌ๊ณ ๋‚˜์„œ string์„ list๋กœ ๋ฐ”๊พธ์–ด ์ดํ›„์— ๋ฐ˜๋ณต๋ฌธ์„ ์ˆ˜ํ–‰ํ•˜๋ฉฐ ํ•จ์ˆ˜ ํ•˜๋‚˜ํ•˜๋‚˜๋ฅผ ํƒ์ƒ‰ํ•  ์ˆ˜ ์žˆ๋„๋ก ํ•˜์˜€์Šต๋‹ˆ๋‹ค. 
    • ๊ฐ€์žฅ ๊ณ ๋ฏผ์ด ๋˜์—ˆ๋˜ ๋ถ€๋ถ„์€ ๋ฐฐ์—ด(array)์„ ์ž…๋ ฅ๋ฐ›๋Š” ๋ถ€๋ถ„์ด์—ˆ๋Š”๋ฐ, ๋ฐฐ์—ด์ด "1 2 3 4" ์ด๋Ÿฐ์‹์œผ๋กœ ์ž…๋ ฅ๋˜๋Š” ๊ฒƒ์ด ์•„๋‹ˆ๋ผ "[1,2,3,4]" ์ด๋ ‡๊ฒŒ ๋ฆฌ์ŠคํŠธ๋กœ ๋ณด์ด๋Š” ๋ฌธ์ž์—ด๋กœ ์ž…๋ ฅ๋˜๊ธฐ ๋•Œ๋ฌธ์— ๋ฌธ์ž์—ด ์ฒ˜๋ฆฌ๋ฅผ ํ•˜์—ฌ ์‹ค์ œ ๋ฆฌ์ŠคํŠธ ํ˜•ํƒœ๋กœ ์ž…๋ ฅ์„ ๋ฐ›์•„์•ผ ํ•ฉ๋‹ˆ๋‹ค. ์ฒ˜์Œ์—๋Š” `,`๋กœ split()ํ•จ์ˆ˜๋ฅผ ์จ์„œ ๋ฌธ์ž์—ด์„ ์ฒ˜๋ฆฌํ•˜๋ ค๊ณ  ํ•˜์˜€์ง€๋งŒ, eval() ํ•จ์ˆ˜๋กœ ๊ฐ„๋‹จํ•˜๊ฒŒ ์ฒ˜๋ฆฌํ•  ์ˆ˜ ์žˆ์—ˆ์Šต๋‹ˆ๋‹ค. eval()ํ•จ์ˆ˜๋Š” ํŒŒ์ด์ฌ์—์„œ ๋ฌธ์ž์—ด๋กœ ํ‘œํ˜„๋œ ํ‘œํ˜„์‹์„ ์‹คํ–‰ํ•˜๊ณ  ๊ฒฐ๊ณผ๋ฅผ ๋ฐ˜ํ™˜ํ•˜๋Š” ํ•จ์ˆ˜์ž…๋‹ˆ๋‹ค. ๋”ฐ๋ผ์„œ string์œผ๋กœ ์ž…๋ ฅ๋ฐ›์€ "[1,2,3,4]"๋ฅผ ๋ฆฌ์ŠคํŠธ๋กœ ํŒ๋‹จํ•˜์—ฌ ๋ฐ”๋กœ ๋ฆฌ์ŠคํŠธ๋กœ ํŒ๋‹จํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋ฆฌ๊ณ ๋‚˜์„œ ๋ฑ์œผ๋กœ ๋ฌธ์ œ๋ฅผ ํ’€์–ด์•ผํ•˜๊ธฐ ๋•Œ๋ฌธ์— deque()๋กœ ๋‹ค์‹œ ์ž๋ฃŒํ˜•์„ ๋ฐ”๊พธ์–ด์ฃผ์—ˆ์Šต๋‹ˆ๋‹ค.



    2. ๋ฌด์กฐ๊ฑด error๊ฐ€ ์ถœ๋ ฅ๋˜๋Š” ์ƒํ™ฉ ๋จผ์ € ํŒ๋‹จํ•˜๊ธฐ

    if p.count("D") > len(array):
        print("error")
        continue

    D์˜ ๊ฐœ์ˆ˜๊ฐ€ ๋ฐฐ์—ด์˜ ์ „์ฒด ๊ธธ์ด๋ณด๋‹ค ๋งŽ๋‹ค๋ฉด ๋‹น์—ฐํžˆ error๊ฐ€ ์ถœ๋ ฅ๋˜์•ผํ•  ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๋”ฐ๋ผ์„œ ๋ฐ˜๋ณต๋ฌธ ๋“ค์–ด๊ฐ€๊ธฐ ์ „์— ์ด ๊ฒฝ์šฐ๋ฅผ ๊ฒ€์‚ฌํ•œ๋‹ค. erorr๋ผ๋ฉด continue๋กœ ์ดํ›„ ๋ฐ˜๋ณต๋ฌธ์„ ๋“ค์–ด๊ฐ€์ง€ ์•Š๋„๋ก ํ•ฉ๋‹ˆ๋‹ค.

     

    3. ๋ฑ์„ ์‚ฌ์šฉํ•˜์—ฌ ๊ตฌํ˜„ํ•˜๊ธฐ

    ์ผ๋‹จ ๋ถ€๋„๋Ÿฝ์ง€๋งŒ ๋‚˜์˜ ์‚ฝ์งˆ... ์—ญ์‹œ๋‚˜ ์ด ๋ฌธ์ œ๋Š” ๋นก์Žˆ ์‹œ๊ฐ„ ์ œํ•œ์„ ํ•ด๊ฒฐํ•ด์•ผ ํ’€ ์ˆ˜ ์žˆ๋Š” ๋ฌธ์ œ์ž…๋‹ˆ๋‹ค. 

    ์šฐ์„  ๋กœ์ง์€, ๋ฐฐ์—ด์„ ๋’ค์ง‘์–ด์•ผํ•  ๋•Œ๋งˆ๋‹ค reverse() ํ•จ์ˆ˜๋‚˜ array[::-1]์ฒ˜๋Ÿผ ์Šฌ๋ผ์ด์‹ฑ์œผ๋กœ ๋’ค์ง‘๋Š”๋‹ค๋ฉด ์—ฐ์‚ฐ๋งˆ๋‹ค $O(N)$์˜ ์‹œ๊ฐ„๋ณต์žก๋„๋กœ ์—ฐ์‚ฐ์ด ๋˜๊ธฐ ๋•Œ๋ฌธ์— ๋ฌด์กฐ๊ฑด ์‹œ๊ฐ„์ดˆ๊ณผ๊ฐ€ ๋‚ฉ๋‹ˆ๋‹ค. ๋”ฐ๋ผ์„œ ๋ฐฉํ–ฅ์„ ์ €์žฅํ•˜๊ณ  ์žˆ๋Š” flag๋ฅผ ๋งŒ๋“ค์–ด์„œ ๋’ค์ง‘์„ ๋•Œ๋งˆ๋‹ค ๊ทธ flag์˜ ๊ฐ’๋งŒ ๋ฐ”๊พธ๊ณ  ๋’ค์ง‘๋Š” ์—ฐ์‚ฐ์€ ๋งˆ์ง€๋ง‰์— ํ•œ๋ฒˆ๋งŒ ์ˆ˜ํ–‰ํ•  ์ˆ˜ ์žˆ๋„๋ก ํ•ฉ๋‹ˆ๋‹ค.

    direction = 1
    for f in p:
        if f == 'R':
            direction *= -1
        elif f == 'D':
            if len(array) == 0:
                print("error")
                break
            if direction == 1:
                array.popleft()
                # array = array[1:]
            else:
                array.pop()
                # array = array[:-1]
    if direction == -1:
        array.reverse()
    • ๋ฐฉํ–ฅ์„ ์ €์žฅํ•˜๋Š” flag์ด direction์„ ์ฒ˜์Œ์—๋Š” 1๋กœ ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค. 
    • ์ˆ˜ํ–‰ํ•ด์•ผ ํ•  ํ•จ์ˆ˜๋“ค์ด ๋‹ด๊ฒจ์žˆ๋Š” p์—์„œ ํ•จ์ˆ˜๋“ค์„ ํ•˜๋‚˜์”ฉ ๊บผ๋‚ด๋ฉด์„œ R์ผ ๋•Œ๋Š” ๋ฐฉํ–ฅ์˜ ๋ถ€ํ˜ธ๋งŒ ๋ฐ”๊พธ์–ด์ค๋‹ˆ๋‹ค. D์ผ ๋•Œ๋Š” ๋ฐฉํ–ฅ์„ ๋ณด๊ณ  ์ •๋ฐฉํ–ฅ์ผ ๋•Œ๋Š” ์•ž์—์„œ ๊บผ๋‚ด๊ณ (popleft()), ์—ญ๋ฐฉํ–ฅ์ผ ๋•Œ๋Š” ๋’ค์—์„œ ๊บผ๋ƒ…๋‹ˆ๋‹ค(pop()).
    • ์ด๋•Œ, ์›์†Œ๋ฅผ ์ œ๊ฑฐํ•˜๋Š” ๋ฐฉ๋ฒ•์—์„œ ์‹œ๊ฐ„๋ณต์žก๋„์˜ ์ฐจ์ด๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค. ๋งŒ์•ฝ array๋ฅผ ๋ฆฌ์ŠคํŠธ ์ž๋ฃŒํ˜•์œผ๋กœ ๋‘๊ณ  ์Šฌ๋ผ์ด์‹ฑ(list = list[1:])์œผ๋กœ ์ œ๊ฑฐํ•œ๋‹ค๋ฉด ์‹œ๊ฐ„๋ณต์žก๋„๋Š” $O(N)$ ์ด์ง€๋งŒ ๋ฑ(deque)์—์„œ popleft()๋‚˜ pop() ํ•จ์ˆ˜๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์›์†Œ๋ฅผ ์ œ๊ฑฐํ•˜๋ฉด ์‹œ๊ฐ„๋ณต์žก๋„๊ฐ€ $O(1)$ ์ž…๋‹ˆ๋‹ค.
      ์™œ๋ƒํ•˜๋ฉด ๋ฆฌ์ŠคํŠธ์—์„œ ์Šฌ๋ผ์ด์‹ฑ์„ ํ†ตํ•ด ๋งจ ์•ž ์›์†Œ๋ฅผ ์ œ๊ฑฐํ•˜๋Š” ๊ฒƒ์€ ์ƒˆ ๋ฆฌ์ŠคํŠธ๋ฅผ ์ƒ์„ฑํ•˜๊ณ  ์›์†Œ๋ฅผ ๋ณต์‚ฌํ•˜๊ธฐ ๋•Œ๋ฌธ์— ๋น„ํšจ์œจ์ ์ž…๋‹ˆ๋‹ค. ๋ฐ˜๋ฉด์— ๋ฑ์—์„œ ๋งจ ์•ž ์›์†Œ๋ฅผ ์ œ๊ฑฐํ•˜๋Š” ๊ฒƒ์€ ๋งค์šฐ ํšจ์œจ์ ์ด๊ณ , ์ƒ์ˆ˜ ์‹œ๊ฐ„์— ์ˆ˜ํ–‰๋ฉ๋‹ˆ๋‹ค.
    • ํ•จ์ˆ˜๋ฅผ ๋ชจ๋‘ ์ˆ˜ํ–‰ํ•œ ๋’ค์— direction์ด -1์ด๋ผ๋ฉด ์ด๋•Œ ๋งˆ์ง€๋ง‰์œผ๋กœ ํ•œ๋ฒˆ๋งŒ reverse() ์—ฐ์‚ฐ์„ ์ˆ˜ํ–‰ํ•ฉ๋‹ˆ๋‹ค.

     

    4. ๊ฒฐ๊ณผ ์ถœ๋ ฅ

    print(str(list(array)).replace(' ', ''))

    ๊ฒฐ๊ณผ ์ถœ๋ ฅ ์‹œ, [1, 2, 3, 4]๊ฐ€ ์•„๋‹Œ blank์—†์ด [1,2,3,4]๋กœ ์ถœ๋ ฅ๋˜์–ด์•ผํ•˜๊ธฐ ๋•Œ๋ฌธ์— ์œ„์™€ ๊ฐ™์ด ๋ฌธ์ž์—ด ์ฒ˜๋ฆฌ๋ฅผ ํ•œ ํ›„, ์ถœ๋ ฅํ•ฉ๋‹ˆ๋‹ค.

     

    ๐ŸŒฑ ์ •๋‹ต ์ฝ”๋“œ

    # !/usr/bin/env python
    # -*- coding: utf-8 -*-
    # boj 5430 AC
    
    import sys
    from collections import deque
    
    input = sys.stdin.readline
    
    T = int(input())
    
    for _ in range(T):
        p = input()
        p.replace("RR", "")
        p = list(p)
        n = int(input())
        array = deque(eval(input()))
    
        if p.count("D") > len(array):
            print("error")
            continue
    
        direction = 1
        for f in p:
            if f == 'R':
                direction *= -1
            elif f == 'D':
                if len(array) == 0:
                    print("error")
                    break
                if direction == 1:
                    array.popleft()
                else:
                    array.pop()
        if direction == -1:
            array.reverse()
        print(str(list(array)).replace(' ', ''))

     

     

    ๋ฐ˜์‘ํ˜•

    ๋Œ“๊ธ€