[Review] 월간 코드 챌린지 시즌2 2차 3번 - 110 옮기기

shsh·2021년 5월 29일
0

월간코드챌린지

목록 보기
6/7

110 옮기기 - Level 3

https://programmers.co.kr/learn/courses/30/lessons/77886#


  • stack 사용

  • 예시 추가
    입력 : ["1011110","01110","101101111010"]
    정답 : ["1011011","01101","101101101101"]

https://programmers.co.kr/learn/courses/30/lessons/77886/questions 에서 도움얻음


My Answer

def solution(s):
    answer = []
    
    def func(string):
        cnt = 0
        stack = []
        
        for i in range(len(string)):
            if string[i] == "0" and stack[-2:]==["1","1"]:
                cnt += 1
                stack.pop()
                stack.pop()
            else:
                stack.append(string[i])
        
        string = ''.join(stack)
        
        tmp = "110"*cnt
        
        if "111" in string:
            idx = string.index("111")
            string = string[:idx] + tmp + string[idx:]
        elif "11" == string[-2:]:
            string = string[:-2] + tmp + "11"
        elif "01" == string[-2:]:
            string = string[:-1] + tmp + "1"
        elif "1" == string[-1:]:
            string = tmp + string
        else:
            string += tmp
        
        return string
    
    for i in range(len(s)):
        answer.append(func(s[i]))
    
    return answer

보기 좋게 함수를 따로 만들어서 처리해줬다

먼저 110 들을 싹 없애주기 위해 stack 을 만들어서 한숫자씩 넣어줌
0 이 나오면 앞에 두자리가 11 인지 확인해서 맞다면 110 이니까 pop * 2

cnt 길이 만큼 110 만들어주기 => tmp = "110" * cnt

다음은 111 이 있으면 111 앞에 tmp 넣어주기
그 외에 맨 마지막 부분이 11 이면 11 앞에 tmp 넣어주기
그 외에 맨 마지막 부분이 01 이면 1 앞에 tmp 넣어주기
그 외에 맨 마지막 부분이 1 이면 1 뒤에 tmp 넣어주기
나머지는 맨 뒤에 tmp 붙여주기

처음에는 while 문을 110 이 아예 안나올때까지 돌려서 찾는 식으로 함

while "110" in string:
    cnt += string.count("110")
    string = string.replace("110","")

이러면 타임리밋...^^

stack 꼭 사용하기!!

profile
Hello, World!

0개의 댓글

관련 채용 정보