코딩테스트/SWEA
[Python, 파이썬] SWEA 1234. [S/W 문제해결 기본] 10일차 - 비밀번호
알코딩
2024. 10. 18. 21:46
0~9로 이루어진 번호 문자열에서 더 이상 소거할 게 없을 때까지
같은 번호로 붙어있는 쌍들을 모두 제거하면 나오는 비밀번호는?

[코드]
T = 10
for test_case in range(1, T+1):
N, password = input().split()
find = True
i = 0
while(find): # 소거할 번호쌍이 없으면 종료
i = 0 # i 값 초기화
find = False # 중복을 찾지 못하면 루프 종료, 찾으면 True로 바꿈
while i < len(password) - 1: # 소거할 변호쌍 탐색
if(password[i]== password[i+1]):
password = password[:i] + password[i+2:] # i와 i+1을 제외한 부분으로 새로운 문자열 생성
find = True
else:
i += 1
print("#%d %s" %(test_case, password))
[문제풀이]
더 이상 소거할 번호쌍이 없을때까지 계속해서 붙어있는 번호쌍을 제거시킨다.

이렇게 외부 while문과 내부 while 문을 돌려 내부 while문은 리스트를 탐색해 중복을 제거한다.
그리고 외부에선 내부 while문에서 중복이 더 이상 발견하지 못할때까지 계속 탐색한다.
while i < len(password) - 1: # 소거할 변호쌍 탐색
이때 왜 for문이 아니라 while문을 사용했냐면, 내부에서 반복하는 password 리스트를 삭제시켜 개수를 변경하기 때문에 그대로 for문을 돌리다가는 list out of index 오류가 발생할 수 있기 때문!
else:
i += 1
그래서 중복쌍 발견시 소거, 그리고 i를 중복을 발견하지 못할시에만 증가시키는 것으로 소거시 그 위치부터 탐색하도록 했다.