2023. 8. 8. 17:23ㆍAlgorithm
📎 링크
🤔 문제설명, 제한사항, 입출력 예
주어진 문자열 s를 아래 규칙에 따라서 분해하고, 분해된 문자열의 개수를 구하라는 문제이다.
- 문자열 s의 첫 글자를 x라고 한다. (문자열 s는 소문자로만 이루어진다.)
- 문자열을 읽어나가면서 x가 나온 횟수와 x가 아닌 글자가 나온 횟수를 카운트한다.
- 처음으로 두 횟수가 같아지는 순간 (0 제외) 이 카운트를 멈추고, 지금까지 읽은 문자열을 분리한다.
- 분리된 문자열을 빼고, 남은 부분에 대해서 "첫 글자를 읽고 -> 문자별 나온 횟수 카운트" 과정을 반복한다.
- 두 카운트가 다른 상태에서 (0 포함) 더 이상 읽을 글자가 없다면, 남은 문자열을 분리하고 반복을 종료한다.
🤔 내가 생각한 풀이 과정
첫 문자 x를 저장하고 문자열을 문자 하나씩 반복하면서, x와 같은 문자인지 비교해 준다.
만약 반복하는 문자가 x와 같은 문자라면, x_count를 1 증가시킨다. 반대인 경우에는, non_x_count를 1 증가시킨다.
이때, x_count와 non_x_count 두 값이 모두 1 이상이면서, 서로 같은지를 계속 같이 확인해 준다.
만약 두 값이 같아졌다면, 첫 문자를 다음 인덱스의 문자로 저장하고 x_count와 non_x_count를 0으로 초기화시켜 준다.
최종으로 반환할 문자열의 개수 answer의 변수 값도 같이 1 증가시켜 준다.
이때 중요한 점은, 최종으로 반환할 answer의 초기값이 0이 아니라 1로 설정되었다는 점이다.
내 코드에서는 리스트의 Out of Range 오류를 방지하기 위해 문자열의 반복 범위를 len(s)-1까지로 설정했는데, 그 이유는 x를 새로 설정하는 부분이 인덱스 값보다 1 큰 값을 지정하는 코드와 연관되어 있다.
만약, 문자열의 마지막 부분에서 x_count와 non_x_count 값이 같아진다고 했을 때,
다음 x 문자는 현재 인덱스 다음 값으로 지정이 되는데, 마지막 부분이라면 현재 인덱스의 다음 값은 존재할 수 없다.
즉, 이런 상황에서 리스트의 범위를 벗어나는 Out of Range 오류가 발생하게 되는 것이다.
그러므로, 마지막으로 남을 문자를 애초에 반복하지 않고,
그 문자로 인해 문자열이 분리가 되든지 아니든지 상관없이 나는 무조건 별도의 문자열 1개가 분리된다고 가정을 했기에 answer의 초기값이 0이 아닌 1로 설정을 할 수 있었다.
👨💻 코드
def solution(s):
answer = 1
x = s[0]
x_count = non_x_count = 0
for i in range(len(s)-1):
if s[i] == x:
x_count += 1
else:
non_x_count += 1
if x_count >= 1 and x_count == non_x_count:
answer += 1
x = s[i+1]
x_count = non_x_count = 0
return answer
'Algorithm' 카테고리의 다른 글
[Programmers/Lv. 2] 삼각 달팽이 (월간 코드 챌린지 시즌1, Python) (0) | 2023.08.15 |
---|---|
[Programmers/Lv. 1] 달리기 경주 (프로그래머스 연습문제, Python) (0) | 2023.08.09 |
[Programmers/Lv. 1] 신고 결과 받기 (2022 KAKAO BLIND RECRUITMENT, Python) (0) | 2023.08.08 |
[Programmers/Lv. 0] 코딩테스트 입문 Day 25 - 시뮬레이션, 조건문, 수학 (Python) (0) | 2023.06.07 |
[Programmers/Lv. 0] 코딩테스트 입문 Day 24 - 수학, 시뮬레이션, 문자열, 조건문, 반복문 (Python) (0) | 2023.06.06 |