coding skill

[백준][문제 풀기] 알고리즘 기초 1/2 - 10799 쇠막대기

pikabite 2022. 3. 12. 16:35

이번 문제는 정답비율이 63퍼 정도 되는 문제다.
바로 풀이과정을 보자


import sys

if __name__ == "__main__" :

    # 데이터를 잘 받자!
    str_ = sys.stdin.readline().strip()

    staack = []
    sticks = {}
    total_frags = 0

    its_laser = False

    for i, v in enumerate(str_) :
        if i < len(str_)-1 and (v+str_[i+1]) == "()" :
            # 레이저
            for v in sticks :
                sticks[v] += 1
            its_laser = True
            continue
        elif its_laser :
            its_laser = False
            continue
        elif v == "(" :
            staack.append(1)
            if len(staack)-1 not in sticks :
                sticks[len(staack)-1] = 0
        elif v == ")" :
            lastone = len(staack)-1
            # 닫힌 스틱이 포함하는 laser 수 + 1이 곧 조각 수
            total_frags += (sticks[lastone] + 1)
            del sticks[lastone]
            staack.pop()

    print(total_frags)

시간초과

  • 위 풀이에서 시간초과가 났다. 제한시간이 1초여서 상당히 느슨할거라 생각했는데, 전혀 그렇지 않았다.
  • 스택구조로 변경하고 코딩의 편의를 위해 dictionary를 사용한 것을 없애야할거같다.
import sys

if __name__ == "__main__" :

    # 데이터를 잘 받자!
    str_ = sys.stdin.readline().strip()

    sticks = []
    total_frags = 0


    for i, v in enumerate(str_) :
        if v == "(" :
            sticks.append(0)
        elif v == ")" :
            if i > 0 and str_[i-1] == "(" :
                # 레이저
                for i, v in enumerate(sticks) :
                    sticks[i] += 1
                continue
            lastone = len(sticks)-1
            # 닫힌 스틱이 포함하는 laser 수 + 1이 곧 조각 수
            total_frags += (sticks.pop() + 1)

    print(total_frags)

시간초과

  • stack 구조로 가서 시간 소모를 줄였다 생각했는데, 중간 for문 때문에 여전히 시간초과가 나는 모양이었다.
import sys

if __name__ == "__main__" :

    # 데이터를 잘 받자!
    str_ = sys.stdin.readline().strip()

    sticks = []
    total_frags = 0

    for i, v in enumerate(str_) :
        if v == "(" :
            sticks.append(len(sticks)+1)
        elif v == ")" :
            if str_[i-1] == "(" :
                # 레이저
                sticks.pop()
                if len(sticks) > 0 :
                    total_frags += sticks[-1]
            else :
                # 나머지 조각 수
                total_frags += 1
                sticks.pop()

    print(total_frags)

정답 맞춘 풀이

  • stack을 할 때 미리 현재의 stack 사이즈를 push하면 간단히 해결이 된다.
  • 그런데 이렇게 진행 할거면 차라리 stack을 하는게 아니라 그냥 stack size만 변수로 저장해도 될 것 같다.
  • 이 문제의 핵심은 stack 구조를 이해하고, 적절히 효율적인 코드로 만들 수 있느냐인것같다. 더 빨리 풀어야할텐데 갈 길이 멀다