코드
def solution(s):
answer = 0 # 분해한 문자열의 개수
isx, isnotx = 0, 0 # x와 같은 글자 수, 다른 글자 수
for i in range(len(s)):
if isx == isnotx: # 두 횟수가 같으면 분리(answer+1)
answer += 1
x = s[i]
isx, isnotx = 0, 0
if s[i] == x:
isx += 1
else:
isnotx += 1
return answer
문자열 s의 첫 글자를 x라 할 때, 차례대로 문자를 읽어가며 x와 같은 문자의 개수와 다른 문자의 개수를 저장한다.
그러다 같은 문자의 개수와 다른 문자의 개수가 같아지면 s를 분리하는 문제이다.
그다지 어려운 문제는 아니지만 오랜 시간 동안 헤맸기 때문에 풀이를 작성해 본다.
먼저, 필요한 변수를 설정한다.
문제를 읽으면서 필요하다고 생각이 바로 드는 x와 같은 문자열의 개수, 다른 문자열의 개수를 나타내는 isx, isnotx를 만들어주었다.
이 두 변수를 사용하여 for문을 진행한다.
문자열 s에 있는 요소를 하나씩 불러와 x와 같은 지 확인한다. 같으면 isx를 +1, 다르면 isnotx를 +1 해준다.
위 과정은 쉽게 생각해 낼 수 있다. 하지만, isx == isnotx 일 때가 문제였다.
isx == isnotx이면 문자열을 분리하므로 answer+1을 하고 모든 변수를 초기화해준다.
하지만, if isx == isnotx를 for문의 마지막에 작성해 주면 구하고자 하는 답이 나오지 않을뿐더러, x를 초기화 과정에서 머리가 복잡해졌다.
그래서 이 if문을 어디에 배치를 시켜야 하는지, 아니면 이 방법이 잘못된 것인지 고민하게 되었다.
isx, isnotx를 한 다음에 두 값이 같은지 비교하는 게 아닌 처음에 비교를 하는 건 어떤가 하고 if문을 앞에 배치해 보았다.
for i in range(len(s)):
if isx == isnotx: # 두 횟수가 같으면 분리(answer+1)
answer += 1
x = s[i]
isx, isnotx = 0, 0
if s[i] == x:
isx += 1
else:
isnotx += 1
isx, isnotx를 구한 뒤에 같은지 비교하는 게 아닌, 다음 문자열(i+1) 차례에 이전의 isx, isnotx가 같은지를 먼저 비교하겠다는 것이다.
문제에서 '만약 두 횟수가 다른 상태에서 더 이상 읽을 글자가 없다면, 역시 지금까지 읽은 문자열을 분리하고, 종료합니다.'라고 알려주었다.
'aaabc'와 같이 끝까지 읽었을 때 isx=3, isnotx=2가 되어, 두 횟수가 다른 상태에서 더 이상 읽을 문자열이 없으면 문자열을 분리한다는 것이므로 answer+1을 해 결과적으로 answer=1이 되어야 한다는 뜻이다.
그러므로 answer를 먼저 +1 한 상태에서 isx, isnotx를 계산해도 결과는 달라지지 않는다.
전체 과정을 글로 작성하기 어려워 직접 손으로 적어보면 훨씬 이해하는데 크게 도움이 된다.
아래 사진에서 흰색은 그대로 유지되는 값, 파란색은 if isx==isnotx 구문에 의해 바뀌는 값, 노란색은 isx, isnotx를 계산함에 따라 바뀌는 것을 표시하였다.