coding test

[파이썬] 4873. 반복문자 지우기

잔망루피 2021. 1. 13. 21:33

swexpertacademy.com/main/learn/course/lectureProblemViewer.do

 

SW Expert Academy

SW 프로그래밍 역량 강화에 도움이 되는 다양한 학습 컨텐츠를 확인하세요!

swexpertacademy.com

 

※ SW Expert 아카데미의 문제를 무단 복제하는 것을 금지합니다.


문자열 s에서 반복된 문자를 지우려고 한다. 지워진 부분은 다시 앞뒤를 연결하는데, 만약 연결에 의해 또 반복문자가 생기면 이부분을 다시 지운다.

반복문자를 지운 후 남은 문자열의 길이를 출력 하시오. 남은 문자열이 없으면 0을 출력한다.

다음은 CAAABBA에서 반복문자를 지우는 경우의 예이다.
 

CAAABBA 연속 문자 AA를 지우고 C와 A를 잇는다.

CABBA 연속 문자 BB를 지우고 A와 A를 잇는다.

CAA 연속 문자 AA를 지운다.

C 1글자가 남았으므로 1을 리턴한다.

 
 

[입력]
 

첫 줄에 테스트 케이스 개수 T가 주어진다.  1≤T≤ 50
 

다음 줄부터 테스트 케이스의 별로 길이가 1000이내인 문자열이 주어진다.

 

[출력]
 

#과 1번부터인 테스트케이스 번호, 빈칸에 이어 답을 출력한다.

입력 출력
3
ABCCB
NNNASBBSNV
UKJWHGGHNFTCRRCTWLALX
#1 1
#2 4
#3 11

 

나의 풀이

 

T = int(input())
# 여러개의 테스트 케이스가 주어지므로, 각각을 처리합니다.
for test_case in range(1, T + 1):
    _str=list(input())
    stack=list()
    
    while _str:
        s=_str.pop(0)
        if not stack or stack[-1] != s:		# stack에 값이 없거나 stack의 마지막 값과 s가 같지 않다면
            stack.append(s)
        else:
            stack.pop()

    print(f"#{test_case} {len(stack)}")

 

리스트 _str에 값이 있을 동안 반복한다.

_str에서 0번째 인덱스 값을 뽑아서 리스트 stack의 마지막 값과 비교한다. 두 값이 같지 않다면 stack에 s를 추가한다.

값이 같으면 stack에서 pop한다.

 

🎑 다른사람 풀이

 

T = int(input())

for TC in range(1, T + 1):
    string = str(input())
    i=0
    while 1:
        if i == len(string)-1:
            break
        if string[i] == string[i+1]:
            str1 = string[0:i]
            str2 = string[i+2:]
            string = str1 + str2
            #string = string.replace(string[i],"")
            i=0
        else:
            i += 1

    print("#%d %d" %(TC, len(string)))

 

문자열 string의 현재 index 값과 그 다음 값이 같다면 이 값을 제외하고 슬라이싱한다.

슬라이싱 한 두 값을 이어붙여서 string에 할당한다.

두 값이 같지 않다면 인덱스 i를 1증가시킨다.

이 과정을 i가 len(string)-1이 될 때까지 반복한다(i+1땜에 -1함).

 

TC = int(input())

for tc in range(1, TC+1):
    Data = list(input())
    N = len(Data)
    stack = []
    for i in range(N):
        #stack이 비었거나, 스택의 마지막 값이 데이터 내 값과 같지 않은 경우 
        #=> stack에 저장(append)
        if not stack or stack[-1] != Data[i]:
            stack.append(Data[i])
        #stack에 값이 있고, 스택의 마지막 값과 데이터 내 값과 같은 경우 
        #=> stack에서 제거(pop)
        elif stack and stack[-1] == Data[i]:
            stack.pop()
    print(f'#{tc} {len(stack)}')

 

나랑 같은 알고리즘.

 

def repeat(string):
    stack.append(string[0])
 
    for i in range(1,len(string)):
        if stack:
            if stack[-1]!=string[i]:
                stack.append(string[i])
            else:
                stack.pop()
        else:
            stack.append(string[i])		# stack에 값이 없으면 추가
    if stack:
        return len(stack)
    else:
        return 0
 
for t in range(int(input())):
    string=input()
    stack=[]
    print("#{} {}".format(t+1,repeat(string)))

 

반복문자를 지우는 함수를 만듦

처음에 리스트 stack에 string[0]을 추가해서 1부터 반복을 한다.

stack에 값이 있으면 stack의 길이를 return하고 그렇지 않다면 0을 return한다.

 

 

반응형

'coding test' 카테고리의 다른 글

[파이썬] 4875. 미로  (0) 2021.01.15
[파이썬] 4874. Forth  (0) 2021.01.14
[파이썬] 4871. 그래프 경로  (0) 2021.01.13
[파이썬] 4866. 괄호검사  (0) 2021.01.12
[파이썬] 4869. 종이붙이기  (0) 2021.01.11