본문 바로가기

코딩테스트/SWEA

[Python, 파이썬] SWEA 1234. [S/W 문제해결 기본] 10일차 - 비밀번호

 

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를 중복을 발견하지 못할시에만 증가시키는 것으로 소거시 그 위치부터 탐색하도록 했다.