문제 링크
https://programmers.co.kr/learn/courses/30/lessons/77886
코딩테스트 연습 - 110 옮기기
0과 1로 이루어진 어떤 문자열 x에 대해서, 당신은 다음과 같은 행동을 통해 x를 최대한 사전 순으로 앞에 오도록 만들고자 합니다. x에 있는 "110"을 뽑아서, 임의의 위치에 다시 삽입합니다. 예를
programmers.co.kr
풀이
1. '110' 다 제외하기
2. 가장 뒤에 있는 '0' 뒤에 빼낸 '110' 개수만큼 추가하기
이 때 110을 다 제외하고 남은 문자가 없을 때의 반례를 찾지 못해서 시간이 오래 걸렸다 ㅠㅠ
예를 들어 '110' 같은 케이스의 경우 런타임 에러를 발생하여 이 조건도 추가해주었다.
def solution(s):
answer = []
for st in s:
#'110'의 개수
cnt = 0
# 110 을 제거한 문자열 저장할 배열
stack = []
for i in st:
# 0이면 앞에 두글자 1, 1 인지 확인
if i == '0':
if stack[-2:] == ['1', '1']:
# '110' 개수 증가
cnt +=1
# 1, 1 빼내기
stack.pop()
stack.pop()
# 110 아니면 그냥 추가
else:
stack.append(i)
# 1은 그냥 추가
else :
stack.append(i)
# 110 없으면 그대로 추가
if cnt == 0 :
answer.append(st)
# 110을 제거하고 남은 문자열이 없으면 110 개수 만큼 추가
elif not stack:
stack = cnt * ['1','1','0']
answer.append("".join(stack))
else:
idx = len(stack) -1
# 0의 위치 찾기
for i in range(idx, -1, -1):
if stack[i] == '0':
idx = i
break
# 0이 없으면 제일 앞에 추가
if stack[idx] == '1':
stack = ['1','1','0'] * cnt + stack
# 0이 있으면
else :
# 0이 제일 뒤에 위치하면
if idx == len(stack)-1 :
# 제일 뒤에 추가
stack = stack + ['1','1','0'] * cnt
# 사이에 있는 0이면 사이에 추가
else:
stack = stack[:idx+1] + ['1','1','0'] * cnt + stack[idx+1:]
# 정답 넣기
answer.append("".join(stack))
return answer
'개발 > algorithm' 카테고리의 다른 글
[백준 2617번] 구슬 찾기 - python (0) | 2022.04.29 |
---|---|
[프로그래머스] [level3] 하노이의 탑 - python (0) | 2022.04.28 |
[프로그래머스][level3] N-Queen - python (0) | 2022.04.28 |
[백준 9663번] N-Queen - python (0) | 2022.04.28 |
[프로그래머스][level2] k진수에서 소수 개수 구하기 - python (0) | 2022.04.27 |