일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
Tags
- 프로그래머스
- 필기
- cve-2024-6387
- Active Directory
- 세마포어
- race condition
- BoB 12기 최종합격 후기
- Best of the Best
- 디지털 포렌식 트랙
- 리버싱
- cve-2022-26923
- 디포전
- 정보보안기사
- DLL 사이드로딩
- 뮤텍스
- bob
- dll side-loading
- 디지털 포렌식 전문가 2급
- 코드엔진
- BoB 12기
- 정보기
- malware
- 디포전 2급
- h4ckinggame
- CodeEngn
- 논문리뷰
Archives
- Today
- Total
SEO
[프로그래머스/파이썬] 올바른 괄호 본문
반응형
문제 설명
괄호가 바르게 짝지어졌다는 것은 '(' 문자로 열렸으면 반드시 짝지어서 ')' 문자로 닫혀야 한다는 뜻입니다. 예를 들어
- "()()" 또는 "(())()" 는 올바른 괄호입니다.
- ")()(" 또는 "(()(" 는 올바르지 않은 괄호입니다.
'(' 또는 ')' 로만 이루어진 문자열 s가 주어졌을 때, 문자열 s가 올바른 괄호이면 true를 return 하고, 올바르지 않은 괄호이면 false를 return 하는 solution 함수를 완성해 주세요.
제한사항
- 문자열 s의 길이 : 100,000 이하의 자연수
- 문자열 s는 '(' 또는 ')' 로만 이루어져 있습니다.
입출력 예
s | answer |
"()()" | true |
"(())()" | true |
")()(" | false |
"(()(" | false |
입출력 예 설명
입출력 예 #1,2,3,4
문제의 예시와 같습니다.
처음 풀이 방식
- 문자열을 탐색하면서 “(” 일 경우 1을, “)”일 경우 -1을 배열에 넣음
- 이중 for 문 사용
- 더했을 때 0이 되는 첫번째 두 쌍의 값을 0으로 설정
- 배열에 있는 모든 값을 더했을 때 0이 된다면 True, 다른 값이 나온다면 False 변환
def solution(s):
s_list = list(s)
compare = []
if s_list[0] == ")":
return False
for i in s_list:
if (i == "("):
compare.append(1)
else:
compare.append(-1)
for i in range(len(compare)-1):
for j in range(i+1, len(compare)):
if (compare[i] + compare[j] == 0):
compare[i] = 0
compare[j] = 0
count = 0
for i in compare:
count += i
if i == 0:
return True
return False
정답을 맞춘 뒤 다시 코드를 살펴보니 불필요한 코드가 너무 많이 보이네요. 허허
def solution(s):
s_list = list(s)
count_l = 0
count_r = 0
if s_list[0] == ")":
return False
for i in s_list:
if (i == "("):
count_l += 1
else:
count_r += 1
if (count_l - count_r == 0):
return True
return False
반례 : ())((()))(()
기댓값 : false
위와 같은 반례를 처리하기 위해 아래와 같은 풀이 방식으로 접근하였습니다.
- () 쌍이 생기면 pop
- 시작이 “)” 일 경우 false 반환 반복
def solution(s):
s_list = list(s)
count = 0
for i in s_list:
if (i == "("):
count += 1
else:
count -= 1
if count < 0:
return False
if (count == 0):
return True
return False
제출 후 채점하기 전에 추가적인 반례를 더 생각해보는 힘이 필요할 것 같습니다.
그리고 이중 for문은 되도록 사용하지 않는 방식으로 구현하도록 노력해야겠습니다. 이중 for문을 사용하는 순간 바로 O(n**2)의 복잡도가 되어버려 효율성 테스트를 통과하지 못하게 되네요.
반응형
'코딩테스트 > 문제 풀이' 카테고리의 다른 글
[프로그래머스/파이썬] 다리를 지나는 트럭 (0) | 2025.01.05 |
---|---|
[프로그래머스/파이썬] 프로세스 (0) | 2025.01.04 |
[프로그래머스/파이썬] 기능개발 (3) | 2024.12.28 |
[프로그래머스/파이썬] 같은 숫자는 싫어 (2) | 2024.12.28 |
[프로그래머스/파이썬] 베스트앨범 (1) | 2024.12.24 |