안녕하세요. 지난 포스팅의 BOJ 2941번 : 크로아티아 알파벳에서는 replace 함수를 이용해서 크로아티아 알파벳을 단순한 문자로 치환한 뒤 문자열의 길이를 계산하는 방법을 적용해보았습니다. 오늘은 살짝 조건문이 까다로운 문제를 풀어보도록 하겠습니다.
완벽한 코딩은 존재하지 않습니다. 제가 제출한 코드 역시 마찬가지고 그저 참고만 해주시길 바랍니다.
핵심 포인트
- 문자열 자료형
제출 코드
cnt = 0
for _ in range(int(input())) :
S = input()
alpha = [0] * 27
for idx, s in enumerate(S) :
if alpha[ord(s) - 97] == 0 :
alpha[ord(s) - 97] += 1
else :
if S[idx - 1] == s : continue
else : alpha[26] = -1
if alpha[26] != -1 : cnt += 1
print(cnt)
해설
제가 작성한 코드는 아마도 다른 사람들과 달리 복잡할 것입니다. 저는 이와 같이 짜는 것 이상으로는 생각이 나지 않더군요. 간단하게 해설을 해보도록 하겠습니다. 기본적으로 문제에서는 그룹 단어라는 것을 정의하였습니다. 그룹 단어란 연속된 문자가 끊어지지 않고 발생되는 문자열을 의미하죠. 예를 들어, aaabbb 같은 경우입니다. 하지만, aaabbcb 같은 경우에는 마지막 문자 b가 다른 곳에서 발생하기 때문에 그룹 단어가 아닙니다. 따라서 저는 여기서 몇 가지 조건을 생각하였습니다.
1. 해당 문자가 처음 나오는 경우 : alpha[ord(s) - 97] == 0
2. 해당 문자가 처음 나오지 않은 경우 : alpha[ord(s) - 97] != 0
첫번째 조건에서는 해당 문자가 나왔음을 alpha 변수에 표시를 해줍니다. 두번째 조건에서 이미 해당 문자가 나왔을 때 (alpha[ord(s) - 97] != 0)일 때는 다시 두 가지 조건을 생각해볼 수 있습니다.
2-1. 바로 이전 문자와 현재 문자가 동일한 경우 : S[idx - 1] == s
2-2. 바로 이전 문자와 현재 문자가 동일하지 않은 경우 : S[idx - 1] != s
2-1 조건에 따르면 현재까지 순회만 문자열까지는 그룹 단어임을 의미하기 때문에 계속 순회를 수행합니다. 반면에, 해당 문자가 이미 이전에 나왔으며 이전 문자와 현재 문자가 동일하지 않은 경우에는 해당 문제가 그룹 문자가 되지 않죠. 따라서, alpha 변수의 26번째 인덱스를 -1로 처리를 해준 뒤 해당 인덱스가 -1이 아니면 그룹 단어로 인정을 해주면 됩니다.
참고자료 및 그림출처
'Programming > Coding Problem' 카테고리의 다른 글
BOJ 2292번 : 벌집 (0) | 2022.07.06 |
---|---|
BOJ 1712번 : 손익분기점 (0) | 2022.07.05 |
BOJ 2941번 : 크로아티아 알파벳 (0) | 2022.07.03 |
BOJ 5622번 : 다이얼 (0) | 2022.07.01 |
BOJ 2908번 : 상수 (0) | 2022.07.01 |