코딩 테스트 연습/프로그래머스

[Python]Programmers 괄호 회전하기(lv2)

jaeheon0520 2024. 3. 9. 23:58

1. 문제

 

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

 

프로그래머스

코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.

programmers.co.kr

 

괄호로 이루어진 문자열 s를 왼쪽으로 x(0 <= x < (s의 길이))칸만큼 회전했을 때

 

올바른 괄호 문자열을 만드는 x가 몇 번 등장하는지 구하는 문제이다.

 

2. 풀이

올바른 괄호 문자열을 판단하기 위해 보통 스택 자료구조를 활용한다.

 

파이썬에서는 스택을 구현할 때 그냥 리스트를 활용하면 된다.

 

여는 괄호는 스택에 그냥 추가해주고, 

 

닫는 괄호는 스택에서 제일 위에 있는 괄호가 짝이 맞는 괄호라면 pop()을 해줘서 여는 괄호를 제거해주고

 

짝이 맞지 않는 다른 괄호가 나오면(else) 올바른 괄호 문자열이 아니므로 리턴 해주면 된다.

 

만약에 문자열 끝에 도달했는데 스택에 남아 있는 원소가 있다면 닫히지 않은 괄호가 있다는 의미이므로 이 경우도 리턴해주면 된다.

 

괄호를 열고 닫는 과정이 스택에서 원소가 들어가고 나가는 과정과 똑같아서 스택을 배울때 자주 소개된다.

 

is_valid 함수 내부에서 올바른 괄호 문자열을 판단하는 조건문을 보면 or 뒤에 '\' 를 활용했는데  

 

백슬래시 (\)는 파이썬의 이스케이프 시퀀스 중 하나로, 조건문이 너무 길어져서 한 줄에 작성하기 어려운 경우에 사용된다.

백슬래시 \ 다음에 줄 바꿈이 나타나면, 파이썬은 이를 한 줄로 해석하여 조건문을 연결한다.

 

백슬래시를 제거하고 한 줄로 작성하면 다음과 같다.

 

if (bracket == ')' and top == '(') or (bracket == '}' and top == '{') or (bracket == ']' and top == '['):

 

마지막으로 문자열 회전을 구현하기 위해 문자열 슬라이싱을 이용했다.

 

구문은 다음과 같다 String[start:end:step]

 

start: 부분 문자열의 시작 인덱스. 이 인덱스의 문자는 부분 문자열에 포함된다.
end: 부분 문자열의 끝 인덱스. 이 인덱스의 문자는 부분 문자열에 포함되지 않는다.(end-1까지)
step: 현재 문자에서 step간격으로 문자를 추출한다. step을 생략하면 기본값인 1로 설정된다.

3. 코드

def is_valid(s):
    stack = []
    for bracket in s:
        if bracket in ['(', '{', '[']:
            stack.append(bracket)
        elif bracket in [')', '}', ']']:
            if not stack:
                return False
            top = stack.pop()
            if (bracket == ')' and top == '(') or \
               (bracket == '}' and top == '{') or \
               (bracket == ']' and top == '['):
                continue
            else:
                return False  
    if stack:
        return False
    return True

def solution(s):
    answer = 0
    for i in range(len(s)):
        if is_valid(s[i:] + s[:i]): 
            answer += 1
    return answer

 

Reference:

https://menduck.tistory.com/entry/python%ED%8C%8C%EC%9D%B4%EC%8D%AC-%EB%A6%AC%EC%8A%A4%ED%8A%B8-%EC%9A%94%EC%86%8C-%ED%9A%8C%EC%A0%84%ED%95%98%EB%8A%94-4%EA%B0%80%EC%A7%80-%EB%B0%A9%EB%B2%95-%EC%9D%8C%EC%88%98%EC%9D%B8%EB%8D%B1%EC%8A%A4%EB%AC%B8%EC%9E%90%EC%97%B4%EC%8A%AC%EB%9D%BC%EC%9D%B4%EC%8B%B1%EB%AA%A8%EB%93%88deque

 

[python/파이썬] 리스트 요소 회전하는 4가지 방법 - 음수인덱스/문자열슬라이싱/%모듈/deque

안녕하세요! 맨덕입니다. 오늘은 알고리즘 문제를 풀다보면 일차원 리스트를 회전하여 푸는 문제가 많아 일차원리스트를 회전하는 방법 4가지에 대해 정리했습니다. 방법 1. 음수 인덱스를 활용

menduck.tistory.com

 

https://wikidocs.net/14

 

02-3 리스트 자료형

지금까지 우리는 숫자와 문자열에 대해서 알아보았다. 하지만 숫자와 문자열만으로 프로그래밍을 하기에는 부족한 점이 많다. 예를 들어 1부터 10까지의 숫자 중 홀수의 모음인 1, …

wikidocs.net

 

https://www.freecodecamp.org/korean/news/how-to-substring-a-string-in-python/

 

Python 파이썬 문자열 자르는 방법

Python은 문자열을 부분 문자열(substring)로 만드는 여러 가지 방법을 제공하는데, 이것을 ‘슬라이싱(slicing)’이라고 부릅니다 . 구문은 다음과 같습니다. String[start:end:step] 여기서, start: 부분 문자

www.freecodecamp.org