SWEA
[SWEA] 1234. [S/W 문제해결 기본] 10일차 - 비밀번호 (Python/D3)
dev스카이
2023. 11. 16. 07:23
SW Expert Academy
SW 프로그래밍 역량 강화에 도움이 되는 다양한 학습 컨텐츠를 확인하세요!
swexpertacademy.com
설명
번호 문자열에서 같은 번호로 붙어있는 쌍들을 소거하고 남은 번호를 비밀번호로 만든다.
풀이
재귀
- 번호 문자열을 리스트로 만든다.
- 리스트를 재귀로 돌게 한다.
- 리스트 길이만큼 반복문을 돌게 하는데, 여기서 이전과 같은 숫자이면 이전 숫자와 현재 숫자를 리스트에서 제거한다.
- 그리고 그 리스트를 재귀를 돌게 한다.
- 연속된 같은 수가 없을 때까지 반복 혹은 재귀를 돌게 하고 끝이 나면 리스트를 반환한다.
※ 결과값 맨 앞에 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이 있으면 안 된다는 걸 댓글에서 알게 됐다. 이 조건까지 설명에 있었다면 바로 풀었을 것 같다.. 아쉽다.
다른 풀이를 보니 엄청 간단하게 푼 사람도 있다.. 많이 배워야 할 것 같다.