Stay Hungry Stay Foolish

SWEA

[SWEA] 1234. [S/W 문제해결 기본] 10일차 - 비밀번호 (Python/D3)

dev스카이 2023. 11. 16. 07:23

 

 

SW Expert Academy

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

swexpertacademy.com


설명

번호 문자열에서 같은 번호로 붙어있는 쌍들을 소거하고 남은 번호를 비밀번호로 만든다.

 

풀이

재귀

  1. 번호 문자열을 리스트로 만든다.
  2. 리스트를 재귀로 돌게 한다.
  3. 리스트 길이만큼 반복문을 돌게 하는데, 여기서 이전과 같은 숫자이면 이전 숫자와 현재 숫자를 리스트에서 제거한다.
  4. 그리고 그 리스트를 재귀를 돌게 한다. 
  5. 연속된 같은 수가 없을 때까지 반복 혹은 재귀를 돌게 하고 끝이 나면 리스트를 반환한다.

※ 결과값 맨 앞에 0이 있으면 안 되므로 제거해줘야 한다.

Solution

def calc(password):
    for i in range(1, len(password)): 
        if password[i-1] == password[i]: #이전과 같은 숫자이면
            password.pop(i) #현재 숫자 제거
            password.pop(i-1) #이전 숫자 제거
            return calc(password) #다시 재귀 돌리기
    return password #재귀 모두 돌았으면 리스트 반환

for tc in range(1, 11):
    n, password = map(int, input().split())
    word = []
    print('#'+str(tc), end=' ')
    for i in str(password): #입력받은 문자 리스트로 만들기
        word.append(i)
    word = calc(word) #결과 저장
    if word[0] == '0': #맨 앞이 0이면 제거
        word.pop(0) #pop은 인덱스 삭제
    for j in word:
        print(j, end='')
    print()

 

다른 풀이

for tc in range(1, 11):
    n, password = input().split()
    n = int(n)

    stk = []

    for c in password:
        if stk and c == stk[-1]:
            stk.pop()
        else:
            stk.append(c)

    result = ''.join(stk)

    print('#'+str(tc), result)

👩‍💻 회고 

1, 2, 3차 제출에 실패했었는데, 풀이가 잘못된 줄 알았는데 결과값 맨 앞에 0이 있으면 안 된다는 걸 댓글에서 알게 됐다. 이 조건까지 설명에 있었다면 바로 풀었을 것 같다.. 아쉽다.

 

다른 풀이를 보니 엄청 간단하게 푼 사람도 있다.. 많이 배워야 할 것 같다.