Algorithm/Programmers

[Python] 짝지어 제거하기

느낌표 공장장 2021. 5. 15. 01:22
from collections import deque

def solution(s):
    
    if len(s) % 2 == 1 :
        return 0

    s = deque(s)
    temp = []
    i = s.popleft()

    while s :
        j = s.popleft()
        
        if i == j :
            if not s :
                return 1
            else :
                if temp :
                    i = temp.pop()
                else :
                    i = s.popleft()
                continue
        else :
            temp.extend(i)
            i = j

    return 0

 


너무 복잡하게 생각한 문제... ※ 더 쉬운 풀이는 밑에 있어요 ! ※ 

 

1) 홀수 거르기, 처음

from collections import deque

def solution(s):
    
    if len(s) % 2 == 1 :
        return 0

    s = deque(s)
    temp = []
    i = s.popleft()

① s가 홀수라면 거르기. 왜냐하면 홀수이면 완전히 제거될 수 없으므로 0을 반환해준다.

② s를 deque로 변환시켜주고 temp 변수에 리스트를 선언해준다.

③ s에서 첫번째 문자를 i 변수에 뽑아온다.

 

2) while - if문 ( 뽑은 두 문자가 같을때)

   while s :
        j = s.popleft()
        
        if i == j :
            if not s :
                return 1
            else :
                if temp :
                    i = temp.pop()
                else :
                    i = s.popleft()
                continue

① s에 값이 있을때만 돌아가도록 while문을 만들어주고

② s 에서 문자 하나를 뽑아 j에 저장시켜준다.

③ 만약 i == j 라면, 

     1) (if not) s에 있는 문자가 다 제거되었다면 1을 반환한다.

     2) (else) s에 문자가 남아있는 경우.

          2-1) temp에 문자가 있다면 temp의 마지막 값을 뽑아 i에 저장시켜준다.

                  ex) s = 'baabaa' 경우, 첫번째 aa가 지워지고 나면 temp=['b'], s= ['b', 'a', 'a']가 남는다. 합칠필요없이 temp에서 빼냄

          2-2) temp에 문자가 없다면 s의 첫번째 문자를 뽑아 i에 저장시켜준다. 

     그리고 while문의 처음으로 돌아가게 된다.

 

3) while - else문 ( 뽑은 두 문자가 다를 때)

	else :
            temp.extend(i)
            i = j

i를 temp에 추가시켜주고, s의 다음 문자와 비교하기 위하여 j 값을 변수 i에 선언해준다.

 

4) s에 값이 더이상 없을 때 (temp로 제거되지 않는 문자가 다 이동한 경우)

	return 0

0을 반환한다.


 

좀 더 쉽고 간단한 풀이

def solution(s):
    
    answer = []
    
    for i in s:
        
        if not(answer):
            answer.append(i)
            
        else:
            if(answer[-1] == i):
                answer.pop()
            else:
                answer.append(i)  
                
    return not(answer)

for문을 통해 s에서 문자를 하나씩 가져와 answer의 마지막 문자와 같으면 answer의 값도 뽑아서 제거해주고, 다르다면 answer에 추가하는 반복문.

그리고 answer에 값이 있다면 0을 반환하고 값이 없다면 1을 반환한다.

'Algorithm > Programmers' 카테고리의 다른 글

[Python] 이상한 문자 만들기  (0) 2021.05.18
[Python] 약수의 갯수와 덧셈  (0) 2021.05.18
[Python] 예산  (0) 2021.05.14
[Python] 보석 쇼핑  (0) 2021.05.11
[Python] 로또의 최고 순위와 최저 순위  (0) 2021.05.11