괄호 회전하기 ( https://programmers.co.kr/learn/courses/30/lessons/76502# )
프로그래머스의 문제입니다. queue(?)를 이용하여 올바른 문자열이 되는지 확인하는 것을 반복하여 문제를 풀어 내었습니다.
일단 주어진 문자열 s를 한 칸씩 회전시킨 문자열 temp를 만드는 for문을 작성합니다.
temp check 함수에 넘겨 올바른 괄호 문자열이 되는지 확인합니다.
- 일단 opens 즉 열리는 괄호들로 구성된 배열을 만듭니다.
- 이제 temp를 하나씩 확인하며 opens에 포함되는지 판단하여(열림 괄호일 경우) 포함될 경우 arr에 담아줍니다.
- 만약 opens에 포함되지 않을 경우(닫힘괄호가 나올 경우) 해당 닫힘괄호와 arr에서 가장 마지막 값의 괄호가 같은 종류의 괄호일 경우 올바른 괄호임을 확인하고, 다른 종류이거나 arr에 열림 괄호가 존재하지 않을 경우 올바른 괄호가 아니므로 check 함수를 종료합니다.
위의 과정을 반복하여 올바른 괄호 문자열이 나타나는 개수를 세어 답을 구합니다.
opens = ["[","(","{"] #열림괄호를 찾아내기 위한 arr
def check(temp): #회전시킨 문자열을 확인하기 위한 check 함수
arr = []; #열림괄호일 경우 arr에 담아줍니다.
for i in range(len(temp)): #temp의 길이만큼 반복합니다.
if temp[i] in opens: #만약 이번의 문자가 열림괄호일 경우 arr에 담아줍니다.
arr.append(temp[i]);
else:
if len(arr) == 0: #열림괄호가 없는 상태에서 닫힘 괄호가 나왔을 경우.
return False; #올바른 괄호가 아님 check 종료.
else: #열림괄호가 존재할 경우
now = arr.pop(); #열림괄호중 가장 마지막 값을 가져옵니다.
#그리고 가져온 now 값이 현재 닫힘괄호와 맞는 짝일경우 check를 계속 진행합니다.
if now == "[" and temp[i] == "]":
continue;
elif now == "(" and temp[i] == ")":
continue;
elif now == "{" and temp[i] == "}":
continue;
else: #괄호의 짝이 맞지 않을 경우 올바른 괄호가 아니므로 false 리턴. 종료.
return False;
if len(arr) != 0: #반복문이 종료되었는데도 열림괄호 배열인 arr가 비워지지 않았다면, 올바른 괄호 문자열이 아닙니다.
print(arr)
return False;
return True;
def solution(s):
answer = 0;
basic = s;
temp = s;
for i in range(len(s)):
temp = temp[1:] + temp[0]; #첫번째 문자를 가장 뒤로 옮겨 한칸 회전시켜 줍니다.
if check(temp): #check 함수를 통해 True가 나오면 해당 문자열은 올바른 문자열이므로 +1, 아닐경우 그대로 진행시켜 줍니다.
answer += 1;
return answer; #답을 return 합니다.
=> 올바른 괄호 문자열임을 어떻게 확인하느냐에 대한 생각이 가장 중요한 문제였던 것 같습니다. 열림괄호 연속으로 여러개 나온다면, 가장 최근에 나온 열림괄호와 짝이되는 닫힘괄호를 찾아내는 것을 인식하고 해결법을 구현해 낸다면 될 것 입니다.