반응형
Notice
Recent Posts
Recent Comments
Link
«   2024/05   »
1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30 31
Archives
Today
Total
05-19 00:03
관리 메뉴

ImJay

[파이썬/Python] 백준 4949번 균형잡힌 세상 본문

Solved.ac - Python/CLASS 2

[파이썬/Python] 백준 4949번 균형잡힌 세상

ImJay 2023. 5. 18. 23:37
반응형

[파이썬/Python] 백준 4949번 균형잡힌 세상

 

4949번: 균형잡힌 세상

각 문자열은 마지막 글자를 제외하고 영문 알파벳, 공백, 소괄호("( )"), 대괄호("[ ]")로 이루어져 있으며, 온점(".")으로 끝나고, 길이는 100글자보다 작거나 같다. 입력의 종료조건으로 맨 마지막에

www.acmicpc.net


문제

세계는 균형이 잘 잡혀있어야 한다. 양과 음, 빛과 어둠 그리고 왼쪽 괄호와 오른쪽 괄호처럼 말이다.

정민이의 임무는 어떤 문자열이 주어졌을 때, 괄호들의 균형이 잘 맞춰져 있는지 판단하는 프로그램을 짜는 것이다.

문자열에 포함되는 괄호는 소괄호("()") 와 대괄호("[]")로 2종류이고, 문자열이 균형을 이루는 조건은 아래와 같다.

  • 모든 왼쪽 소괄호("(")는 오른쪽 소괄호(")")와만 짝을 이뤄야 한다.
  • 모든 왼쪽 대괄호("[")는 오른쪽 대괄호("]")와만 짝을 이뤄야 한다.
  • 모든 오른쪽 괄호들은 자신과 짝을 이룰 수 있는 왼쪽 괄호가 존재한다.
  • 모든 괄호들의 짝은 1:1 매칭만 가능하다. 즉, 괄호 하나가 둘 이상의 괄호와 짝지어지지 않는다.
  • 짝을 이루는 두 괄호가 있을 때, 그 사이에 있는 문자열도 균형이 잡혀야 한다.

정민이를 도와 문자열이 주어졌을 때 균형잡힌 문자열인지 아닌지를 판단해보자.

입력

각 문자열은 마지막 글자를 제외하고 영문 알파벳, 공백, 소괄호("( )"), 대괄호("[ ]")로 이루어져 있으며, 온점(".")으로 끝나고, 길이는 100글자보다 작거나 같다.

입력의 종료조건으로 맨 마지막에 온점 하나(".")가 들어온다.

출력

각 줄마다 해당 문자열이 균형을 이루고 있으면 "yes"를, 아니면 "no"를 출력한다.

예제 입력

So when I die (the [first] I will see in (heaven) is a score list).
[ first in ] ( first out ).
Half Moon tonight (At least it is better than no Moon at all].
A rope may form )( a trail in a maze.
Help( I[m being held prisoner in a fortune cookie factory)].
([ (([( [ ] ) ( ) (( ))] )) ]).
 .
.

예제 출력

yes
yes
no
no
no
yes
yes

힌트

7번째의 " ."와 같이 괄호가 하나도 없는 경우도 균형잡힌 문자열로 간주할 수 있다.

풀이

import sys
input = sys.stdin.readline

while True:
    string = input().rstrip()  # 입력 문자열을 받고 오른쪽 공백과 개행 문자를 제거
    if string == '.': break  # 문자열이 "."인 경우 반복문을 종료
    for s in string:
        if s not in '()[]':  # 괄호를 제외한 다른 문자들을 모두 제거
            string = string.replace(s, '')
    while '[]' in string or '()' in string:  # 문자열에 괄호 쌍이 있는 동안 반복
        string = string.replace('()', '')  # '()'를 제거
        string = string.replace('[]', '')  # '[]'를 제거
    print('no') if string else print('yes')  # 문자열이 남아있는지 여부에 따라 결과를 출력

주어진 코드의 시간 복잡도를 분석해보자.
입력 문자열의 길이를 n이라 하고 먼저 문자열에서 문자 하나씩 순회하며 괄호가 아닌 문자를 제거하는 부분을 살펴보면, 이 과정은 O(n)의 시간이 소요된다.
그 다음 while 루프에서 '[]' 또는 '()'를 찾아 제거하는 부분을 살펴보면, 이 과정은 최대 O(n)의 시간이 소요될 수 있다. 왜냐하면 replace 메서드를 호출할 때마다 전체 문자열을 순회하여 대체할 패턴을 찾기 때문이다. 따라서 while 루프 내부에서 replace 메서드를 여러 번 호출하는 경우, 최악의 경우 O(n^2)의 시간 복잡도를 가질 수 있다.
마지막으로 결과를 출력하는 부분은 O(1)의 시간이 소요된다.
따라서 전체 코드의 시간 복잡도는 O(n^2)이 될 수 있다. 하지만 평균적으로 괄호의 개수가 제한적이거나 대체할 패턴의 길이가 작은 경우, 시간 복잡도는 O(n)으로 수렴할 수 있다.

 

기존에 풀었던 ' 괄호 ' 문제에서 모범답안으로 소개했던 코드의 풀이가 생각나 쉽게 풀 수 있었다.

시간 복잡도 분석 과정 중 python 의 replace 메소드의 시간복잡도는 논쟁만 있을 뿐 확실한 해답을 찾을 순 없었다. 따라서 계산한 시간 복잡도는 부정확할 수 있다. 생각이 다르다면 의견을 남겨주셨으면 좋겠다.

참고자료

 

[파이썬/Python] 백준 9012번 괄호

[파이썬/Python] 백준 9012번 괄호 9012번: 괄호 괄호 문자열(Parenthesis String, PS)은 두 개의 괄호 기호인 ‘(’ 와 ‘)’ 만으로 구성되어 있는 문자열이다. 그 중에서 괄호의 모양이 바르게 구성된 문자

develop247.tistory.com

 

What is the Big O notation for the str.replace function in Python?

What is the big Oh notation for str.replace function in Python ? Is it always O(n) ? str = "this is string example" print str.replace("is", "was") thwas was string example

stackoverflow.com

 

Does str.replace() have a time complexity O(n^2)?

I am trying to find the time complexity of str.replace() built into python, and this is the data I've managed to gather (here and on other sites): I know replace() is based on the Boyer–Moore algor...

stackoverflow.com

반응형
Comments