728x90
https://school.programmers.co.kr/learn/courses/30/lessons/12973
프로그래머스
코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.
programmers.co.kr
1. 문제
문자열에서 같은 알파벳이 2개 붙어 있는 짝을 찾아서 둘을 제거한뒤 앞뒤로 문자열을 이어붙인다.
짝지어 제거할 수 있으면 1 아니면 0을 리턴한다.
2. 문제풀이 포인트
1. 문자열 길이가 1,000,000 이하의 자연수다 시간복잡도를 생각해야한다.
2. 스택으로 푸는 것이 효율적이다.
3. 첫번째 풀이(실패사례)
def solution(s):
while len(s) > 1:
s = list(s) #문자열을 리스트로 변환
for i in range(len(s)-1):
if s[i] == s[i+1]: s[i] = s[i+1] = '' #인접한 문자가 같은지 검사하고 같다면 빈문자열로 대체
new_s = ''.join(s) #리스트를 다시 문자열로 변환
if len(s) == len(new_s): break #더이상 제거할 문자가 없다면 종료
s=new_s
return 1 if len(s) == 0 else 0
각 단계마다 문자열을 리스트로 변환하고, 중복 검사를 수행하고, 다시 문자열로 조합하는 과정이 반복되므로, 실질적인 처리 시간은 에 가깝다.
스택을 사용하면 문자열을 한 번만 순회하면서 중복 문자를 제거할 수 있기때문에 의 시간복잡도를 가진다.
다음은 스택을 사용한 코드다.
4. 두번째 풀이(성공사례) : 스택 사용
def solution(s):
stack = [] #스택
answer = 0
for case in s:
if stack and stack[-1] == case:
stack.pop()
else:
stack.append(case)
if stack: answer = 0
else: answer = 1
return answer
728x90
'알고리즘&자료구조 > Algorithm' 카테고리의 다른 글
백준 10808 - 알파벳 개수 (0) | 2024.05.18 |
---|---|
백준 2845 - 파티가 끝나고 난 뒤 (0) | 2024.05.17 |
프로그래머스 64065 - 튜플 (1) | 2024.04.26 |
프로그래머스 12930 - 이상한 문자 만들기 (0) | 2024.04.24 |
프로그래머스 12926 - 시저 암호 (0) | 2024.04.24 |