문제
a와 b로만 이루어진 문자열이 주어질 때, a를 모두 연속으로 만들기 위해서 필요한 교환의 회수를 최소로 하는 프로그램을 작성하시오.
이 문자열은 원형이기 때문에, 처음과 끝은 서로 인접해 있는 것이다.
예를 들어, aabbaaabaaba이 주어졌을 때, 2번의 교환이면 a를 모두 연속으로 만들 수 있다.
풀이
- a의 개수를 세고
- a의 개수만큼 slicing한다
- 슬라이싱한 외부와 바꿔가며 완전 a가 되기 위한 최소 개수를 확인한다.
- 이후 슬라이딩 윈도우 방식으로 한 칸 씩 옮겨가며 최소개수를 비교한다.
CODE
import re
import copy
o_string = input()
# a의 개수를 세고
len_a = len(re.findall(r'a', o_string))
start = 0
min_exchange = 10e9
while 1:
string = copy.deepcopy(o_string)
# a의 개수만큼 슬라이싱
end = start + len_a
if end < len(string):
space_a = list(string[start:end])
space_b = list(string[:start] + string[end:])
else:
space_a = list(string[start:]+string[:end-len(string)])
space_b = list(string[end-len(string): start])
# 슬라이싱 외부와 바꿔가며 최소 개수를 확인
exchange = 0
for i, sa in enumerate(space_a):
if sa == 'b':
for j, sb in enumerate(space_b):
if sb == "a":
space_a[i] = "a"
space_b[j] = "b"
break
exchange += 1
if exchange < min_exchange:
min_exchange = exchange
if start > (len(string)-1):
print(min_exchange)
break
start += 1
'CS > Coding Test' 카테고리의 다른 글
[백준] 2638: 치즈 python 구현 / BFS (0) | 2023.04.12 |
---|---|
[백준] 14500: 테트로미노 python 구현 (0) | 2023.04.11 |
[백준] 14502: 연구소 python 구현 / bfs (0) | 2023.04.10 |
[백준] 16236: 아기상어 python 구현 / bfs (0) | 2023.04.10 |
[백준] 20437: 문자열 게임 python 구현 (0) | 2023.03.31 |
댓글