Algorithm
SWEA 1234번: 비밀번호 (D3) - Python 풀이
서서리
2025. 5. 24. 11:59
SMALL
문제 설명
SW Expert Academy
SW 프로그래밍 역량 강화에 도움이 되는 다양한 학습 컨텐츠를 확인하세요!
swexpertacademy.com
평소에 잔머리가 발달하고 게으른 철수는 비밀번호를 기억하는 것이 너무 귀찮았습니다. 적어서 가지고 다니고 싶지만 누가 볼까봐 걱정입니다. 한가지 생각을 해냅니다.
0~9로 이루어진 번호 문자열에서 같은 번호로 붙어있는 쌍들을 소거하고 남은 번호를 비밀번호로 만드는 것입니다. 번호 쌍이 소거되고 소거된 번호 쌍의 좌우 번호가 같은 번호이면 또 소거 할 수 있습니다.
예를 들어 아래의 번호 열을 철수의 방법으로 소거하고 알아낸 비밀 번호입니다.
[입력]
10개의 테스트 케이스가 10줄에 걸쳐, 한 줄에 테스트 케이스 하나씩 제공된다.
각 테스트 케이스는 우선 문자열이 포함하는 문자의 총 수가 주어지고, 공백을 둔 다음 번호 문자열이 공백 없이 제공된다.
문자열은 0~9로 구성되며 문자열의 길이 N은 10≤N≤100이다. 비밀번호의 길이는 문자열의 길이보다 작다.
[출력]
#부호와 함께 테스트 케이스의 번호를 출력하고, 공백 문자 후 테스트 케이스에 대한 답(비밀번호)을 출력한다.
입력
10 1238099084
16 4100112380990844
...
출력
#1 1234
#2 4123
...
풀이 과정
싸피 코테 날에 아침에 머리 깨울 겸 풀어본 문제 3. D3라 좀 어렵길 기대했는데 또 너무 쉬운 문제였습니다.
숫자 배열을 맨 처음부터 끝까지 탐색하면서 좌우가 같은 숫자가 나오면 그 숫자 쌍을 제거하면 됩니다.
정답 코드
T = 10
for ts in range(1, T+1):
N, numbers = input().split()
N = int(N)
numbers = list(map(int, numbers))
# 인덱스 0부터 탐색 시작
i = 0
# 배열의 끝에 도달할 때까지 반복
while i < len(numbers)-1:
# i번째 값과 i+1번째 값이 같으면
if numbers[i] == numbers[i+1]:
# pop을 2번해서 숫자 쌍을 제거
numbers.pop(i)
numbers.pop(i)
# i가 0이 아니었다면 즉, i 이전에 위치한 값이 있다면
if i != 0:
# 배열이 업데이트 돼서 이전 인덱스도 다시 봐야하니까 인덱스 -1
i -= 1
# 값이 다르면
else:
# 다음 숫자 탐색을 위해 인덱스 증가
i += 1
print(f"#{ts} ", end='')
print(''.join(map(str, numbers)))
이상입니다.
LIST