Programmers / 2단계 / 괄호 변환 / python / 2020 KAKAO BLIND RECRUITMENT

2024. 5. 8. 18:18·코딩테스트/programmers (python)

 

https://school.programmers.co.kr/learn/courses/30/lessons/60058

 

 

코드

def check(s):
    stack = []

    for i in s:
        if i == '(':
            stack.append(i)
        else:
            if len(stack) == 0:
                return False
            stack.pop()
    return True

def divide(s):
    left, right = 0,0
    for i in range(len(s)):
        if s[i] == '(':
            left += 1
        else:
            right += 1
        if left == right:
            return s[:i+1], s[i+1:]

def solution(p):
    if not p:
        return ''

    u, v = divide(p)

    if check(u):
        return u + solution(v)
    else:
        answer = '('
        answer += solution(v)
        answer += ')'
        print(u)
        for s in u[1:len(u)-1]:
            if s == '(':
                answer += ')'
            else:
                answer += '('
        return answer

 

# if "균형잡힌 괄호 문자열", then return True
def isBanlancedString(str):
    return str.count('(') == str.count(')')

# if "올바른 괄호 문자열", then return True
def isCorrectString(str):
    count = 0
    for s in str:
        if s == '(':
            count += 1
        else: # ')'
            count -= 1
        if count < 0:
            return False
    return count == 0

def process(str):
    # 1. 입력이 빈 문자열인 경우, 빈 문자열을 반환합니다.
    if str == "":
        return ""
    # 2. 문자열 w를 두 "균형잡힌 괄호 문자열" u, v로 분리합니다. 단, u는 "균형잡힌 괄호 문자열"로 더 이상 분리할 수 없어야 하며, v는 빈 문자열이 될 수 있습니다.
    u, v = splitUV(str)
    print(u, v)
    # 3. 문자열 u가 "올바른 괄호 문자열" 이라면 문자열 v에 대해 1단계부터 다시 수행합니다.
    #   3-1. 수행한 결과 문자열을 u에 이어 붙인 후 반환합니다.
    if isCorrectString(u):
        u += process(v)
        return u
    else: # 4. 문자열 u가 "올바른 괄호 문자열"이 아니라면 아래 과정을 수행합니다.
    #   4-1. 빈 문자열에 첫 번째 문자로 '('를 붙입니다.
        newStr = "("
    #   4-2. 문자열 v에 대해 1단계부터 재귀적으로 수행한 결과 문자열을 이어 붙입니다.
        newStr += process(v)
    #   4-3. ')'를 다시 붙입니다.
        newStr += ")"
    #   4-4. u의 첫 번째와 마지막 문자를 제거하고, 나머지 문자열의 괄호 방향을 뒤집어서 뒤에 붙입니다.
        if len(u) > 0:
            newStr += reverseStr(u[1:-1])
    #   4-5. 생성된 문자열을 반환합니다.
        return newStr

def reverseStr(str):
    ans = ""
    for s in str:
        if s == "(":
            ans += ")"
        else:
            ans += "("
    return ans

# 2. 문자열 w를 두 "균형잡힌 괄호 문자열" u, v로 분리합니다. 단, u는 "균형잡힌 괄호 문자열"로 더 이상 분리할 수 없어야 하며, v는 빈 문자열이 될 수 있습니다.
def splitUV(str):
    u, v = str, ""
    for i in range(2, len(str), 2):
        if isBanlancedString(str[:i]):
            u = str[:i]
            v = str[i:]
            break
    return u, v

def solution(p):
    p = p.strip()

    if isCorrectString(p): # 이미 올바른 괄호 문자열이라면 그대로 return
        return p

    return process(p)

'코딩테스트 > programmers (python)' 카테고리의 다른 글

Programmers / 2단계 / 시소 짝꿍 / python  (0) 2024.05.10
Programmers / 3단계 / 마법의 엘리베이터 / python  (0) 2024.05.09
Programmers / 3단계 / 스티커 모으기(2) / python  (1) 2024.05.07
Programmers / 3단계 / 불량 사용자 / python / 2019 카카오 개발자 겨울 인턴십  (0) 2024.05.04
Programmers / 3단계 / 숫자 게임 / python  (0) 2024.05.02
'코딩테스트/programmers (python)' 카테고리의 다른 글
  • Programmers / 2단계 / 시소 짝꿍 / python
  • Programmers / 3단계 / 마법의 엘리베이터 / python
  • Programmers / 3단계 / 스티커 모으기(2) / python
  • Programmers / 3단계 / 불량 사용자 / python / 2019 카카오 개발자 겨울 인턴십
seulll
seulll
개인 공부 / 정리 블로그입니다 https://github.com/seul1009
  • seulll
    seulll
    seulll
  • 전체
    오늘
    어제
    • 분류 전체보기 (347) N
      • 코딩테스트 (238) N
        • programmers (python) (159) N
        • 백준 (python) (77)
      • 자료구조 | 알고리즘 (14)
      • 개발 | 프로젝트 (44) N
        • Python (4)
        • Java | Spring (8) N
        • Android (5)
        • Unity (3)
        • API (4)
      • CS (15)
        • Network (5)
        • SQL (2)
        • OS (4)
      • 데이터 분석 (14)
      • 기타 (13)
  • 블로그 메뉴

    • 홈
    • 태그
    • 글쓰기
    • 설정
  • 링크

    • GitHub
  • 인기 글

  • 태그

    kakao map api
    야근 지수
    confusion matrix
    asterisk
    카카오맵 api
    모델 성능 평가
    티스토리챌린지
    박스플롯
    solving environment
    카카오맵
    train_test_split
    그리디 알고리즘
    2 x n 타일링
    Python
    오블완
    대입 표현식
    데이터분석
    바다코끼리
    백엔드
    Boxplot
    웹크롤링
    백엔드 개발자 역량
    Greedy
    백엔드 개발자
    프렌즈4블록
    API
    파이썬
    프로그래머스
    코딩테스트
    오차행렬
  • 최근 댓글

  • 최근 글

  • hELLO· Designed By정상우.v4.10.0
seulll
Programmers / 2단계 / 괄호 변환 / python / 2020 KAKAO BLIND RECRUITMENT
상단으로

티스토리툴바