백준 문제 풀이 - 쇠막대기 10799번

Joonyeol Sim👨‍🎓·2021년 10월 26일
0

백준문제풀이

목록 보기
11/128

📜 문제 이해하기

이러한 레이저와 쇠막대기의 배치는 다음과 같이 괄호를 이용하여 왼쪽부터 순서대로 표현할 수 있다.
레이저는 여는 괄호와 닫는 괄호의 인접한 쌍 ‘( ) ’ 으로 표현된다. 또한, 모든 ‘( ) ’는 반드시 레이저를 표현한다.
쇠막대기의 왼쪽 끝은 여는 괄호 ‘ ( ’ 로, 오른쪽 끝은 닫힌 괄호 ‘) ’ 로 표현된다.
위 예의 괄호 표현은 그림 위에 주어져 있다.
쇠막대기는 레이저에 의해 몇 개의 조각으로 잘려지는데, 위 예에서 가장 위에 있는 두 개의 쇠막대기는 각각 3개와 2개의 조각으로 잘려지고, 이와 같은 방식으로 주어진 쇠막대기들은 총 17개의 조각으로 잘려진다.
쇠막대기와 레이저의 배치를 나타내는 괄호 표현이 주어졌을 때, 잘려진 쇠막대기 조각의 총 개수를 구하는 프로그램을 작성하시오.

💡 문제 재정의

쇠막대기 사이로 레이저가 지나갈때 총 쇠막대기의 갯수 구하기

✏️ 계획 수립

레이저가 쇠막대기를 지나갈때 항상 쇠막대기의 갯수만큼 1씩 늘어남
레이저가 지나갈때 그 순간 쇠막대기의 갯수를 알면 풀 수 있다.

💻 계획 수행

if __name__ == '__main__':
    iron_input = input()
    last_input = ""
    truncated_iron_list = []
    piece = 0
    new_iron = 0

    for ch in iron_input:
        # 레이저일때
        if last_input == "(" and ch == ")":
            # 방금 전꺼는 레이저의 일부분이었으니까 삭제
            truncated_iron_list.pop()
            new_iron -= 1

            if truncated_iron_list:
                piece += len(truncated_iron_list)
                if new_iron:
                    for i, _ in enumerate(truncated_iron_list[-new_iron:]):
                        if truncated_iron_list[-new_iron+i] == 0:
                            piece += 1
                            truncated_iron_list[i] = 1
                    new_iron = 0

        # 레이저가 아니라 쇠막대기의 끝일때
        elif last_input == ")" and ch == ")":
            truncated_iron_list.pop()

        # 쇠막대기 시작일때
        else:
            truncated_iron_list.append(0)
            new_iron += 1
        last_input = ch
    print(piece)

🤔 회고

지금 문제를 푼건 마치 세마포어처럼 문제를 풀었지만 스택을 사용하면 좀 더 쉽게 풀 수 있을것같다.

profile
https://github.com/joonyeolsim

0개의 댓글