log.Sehee

[프로그래머스] 올바른 괄호 본문

Algorithm

[프로그래머스] 올바른 괄호

Sehe_e 2023. 8. 28. 22:20

[프로그래머스] 올바른 괄호

 

사용 입출력 예제

s = ")()("
result = False

s = "(())()"
result = True

s = "()())(()"
result = False

s = "(()())"
result = True

 

 


1)

정확성 & 효율성 테스트 : 테스트케이스 실패

더보기
 
정확성 테스트
테스트 1 통과 (0.00ms, 10.3MB)
테스트 2 통과 (0.00ms, 10.1MB)
테스트 3 통과 (0.00ms, 10.1MB)
테스트 4 실패 (0.00ms, 10.3MB)
테스트 5 실패 (0.00ms, 10.2MB)
테스트 6 통과 (0.00ms, 10.1MB)
테스트 7 통과 (0.00ms, 10.2MB)
테스트 8 통과 (0.00ms, 10.3MB)
테스트 9 통과 (0.00ms, 10.1MB)
테스트 10 통과 (0.00ms, 10.2MB)
테스트 11 실패 (0.00ms, 10.1MB)
테스트 12 통과 (0.01ms, 10.2MB)
테스트 13 통과 (0.01ms, 10.2MB)
테스트 14 통과 (0.01ms, 10.1MB)
테스트 15 통과 (0.01ms, 10.1MB)
테스트 16 통과 (0.01ms, 10.1MB)
테스트 17 통과 (0.02ms, 10.2MB)
테스트 18 실패 (0.01ms, 10.2MB)
효율성 테스트
테스트 1 통과 (6.17ms, 10.2MB)
테스트 2 통과 (6.86ms, 10.4MB)
# 1)

def solution(s):
    if s[0] == ")":
        return False	# ")"로 시작하는 테스트케이스는 전부 False

    s_dict = {"(": 0, ")": 0}	# "("와 ")"의 개수 체크

    for i in s:
        s_dict[i] += 1

    return s_dict["("] == s_dict[")"]	# "("와 ")"의 갯수가 같다면 True 반환
    
# s = "()())(()" 일 때 True가 반환됨
# 위 테스트케이스의 return값은 False여야 한다.

 


2)

정확성 & 효율성 테스트 : 테스트케이스 실패

더보기
 
정확성 테스트
테스트 1 실패 (0.00ms, 10.3MB)
테스트 2 통과 (0.00ms, 10.1MB)
테스트 3 통과 (0.00ms, 10.3MB)
테스트 4 통과 (0.00ms, 10.3MB)
테스트 5 통과 (0.00ms, 10.2MB)
테스트 6 통과 (0.00ms, 10.4MB)
테스트 7 통과 (0.01ms, 10.2MB)
테스트 8 통과 (0.01ms, 10.3MB)
테스트 9 실패 (0.01ms, 10.3MB)
테스트 10 실패 (0.01ms, 10.3MB)
테스트 11 통과 (0.00ms, 10.1MB)
테스트 12 실패 (0.00ms, 10.1MB)
테스트 13 실패 (0.01ms, 10.1MB)
테스트 14 실패 (0.00ms, 10.2MB)
테스트 15 실패 (0.01ms, 10.2MB)
테스트 16 통과 (0.02ms, 10.2MB)
테스트 17 통과 (0.00ms, 10.2MB)
테스트 18 통과 (0.01ms, 10.2MB)
효율성 테스트
테스트 1 실패 (0.00ms, 10.2MB)
테스트 2 통과 (0.01ms, 10.3MB)
# 2)
def solution(s):
    left = ""		# "("를 저장할 문자열
    right = ""		# ")"를 저장할 문자열

    for i, n in enumerate(s):
        try:
            if s[0] == ")":
                return False	# ")"로 시작하는 문자열은 False
            elif n == "(":
                left += n
            else:
                right += n
                if s[i + 1] == "(":			# ")"의 다음 문자가 "("이라면
                    if not len(left) == len(right):	# left와 right의 문자 갯수 비교
                        return False			# 갯수가 같지 않다면 False 반환
                    else:
                        left = ""			# 갯수가 같다면 저장 문자열 초기화
                        right = ""
                elif len(left) < len(right):
                    return False			# ")"가 "("보다 많다면 False 반환
        except:
            pass		# out of range 예외처리
            
    return True
    
# s = "(()())" 일 때 False 반환
# 위 테스트케이스의 return 값은 True여야 한다.

 


3)

정확성 & 효율성 테스트 : 효율성 시간초과

더보기
 
정확성 테스트
테스트 1 통과 (0.00ms, 10MB)
테스트 2 통과 (0.00ms, 10.1MB)
테스트 3 통과 (0.00ms, 10MB)
테스트 4 통과 (0.01ms, 10.2MB)
테스트 5 통과 (0.00ms, 10.3MB)
테스트 6 통과 (0.00ms, 10.1MB)
테스트 7 통과 (0.00ms, 10.1MB)
테스트 8 통과 (0.01ms, 10.1MB)
테스트 9 통과 (0.01ms, 10MB)
테스트 10 통과 (0.01ms, 10MB)
테스트 11 통과 (0.01ms, 10.2MB)
테스트 12 통과 (0.01ms, 10.2MB)
테스트 13 통과 (0.01ms, 10.1MB)
테스트 14 통과 (0.01ms, 9.99MB)
테스트 15 통과 (0.01ms, 10.3MB)
테스트 16 통과 (0.02ms, 10.2MB)
테스트 17 통과 (0.01ms, 10MB)
테스트 18 통과 (0.02ms, 10.3MB)
효율성 테스트
테스트 1 실패 (시간 초과)
테스트 2 실패 (시간 초과)
# 3)
def solution(s):
    word = []

    if s[0] == ")":
        return False

    for i in s:
        try:
            if i == "(":
                word.append("(")	# "(" 저장
            else:
                word.remove("(")	# ")"일 때 "(" 삭제
        except:
            return False		# 저장된 "("가 없을 때 ")"가 나온다면 False
            
    if word:
        return False 	# "("가 남아있다면 False

    return True

 

정석은 pop이라고 한다.

remove가 pop보다 오래 걸리나 보다.

 


4)

정확성 & 효율성 테스트

더보기
정확성 테스트
테스트 1 통과 (0.00ms, 10.3MB)
테스트 2 통과 (0.00ms, 10.1MB)
테스트 3 통과 (0.00ms, 10.2MB)
테스트 4 통과 (0.00ms, 10.3MB)
테스트 5 통과 (0.00ms, 10.4MB)
테스트 6 통과 (0.00ms, 9.89MB)
테스트 7 통과 (0.01ms, 10.1MB)
테스트 8 통과 (0.01ms, 9.94MB)
테스트 9 통과 (0.01ms, 10.2MB)
테스트 10 통과 (0.00ms, 10.2MB)
테스트 11 통과 (0.00ms, 10.2MB)
테스트 12 통과 (0.02ms, 9.96MB)
테스트 13 통과 (0.02ms, 10.2MB)
테스트 14 통과 (0.02ms, 10.1MB)
테스트 15 통과 (0.02ms, 10.1MB)
테스트 16 통과 (0.01ms, 10.2MB)
테스트 17 통과 (0.01ms, 10.2MB)
테스트 18 통과 (0.01ms, 10.2MB)
효율성 테스트
테스트 1 통과 (9.67ms, 10.2MB)
테스트 2 통과 (9.81ms, 10.2MB)
# 4)
def solution(s):
    if s[0] == ")":
        return False

    word = {"(": 0}		# "("의 갯수 카운트

    for i in s:
        if i == "(":
            word["("] += 1		# "("일 때 카운트 +1
        else:
            word["("] -= 1		# ")"일 때 카운트 -1
            if word["("] < 0:		# ")"일 때 카운트가 0라면 False 반환
                return False

    return word["("] == 0	# 남은 "(" 갯수가 0개라면 True

 

Comments