본문 바로가기

개발/algorithm

[프로그래머스][level3] 110 옮기기 - python

문제 링크

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