http://acmicpc.net/problem/1316
{코드}
ans = 0
for _ in range(int(input())):
word = input()
new_word = ''
isTrue = True
for c in word:
i, j = word.find(c), word.rfind(c)
if word.count(c) != j-i+1:
isTrue = False
break
ans += isTrue
print(ans)
{설명}
*True는 숫자 1의 값을, False는 숫자 0의 값을 가지고 있습니다.
위 방법은 어떤 문자에 대해 그 문자의 처음과 마지막 위치를 통해 문자들이 연결되어 있는지 아닌지 확인합니다.
예시를 들어 설명해보겠습니다.
-그룹 문자인 예
-
word라는 변수가 있고 'hhaappy'라는 값을 가지고 있습니다.
-
처음에 c는 'h'이며 i는 0, j는 1입니다.
-
이때 word.count는 2를 반환하고 j-i+1은 2이므로 같기 때문에 isTrue를 바꾸지 않습니다.
-
위의 과정이 반복되며 결국 모든 문자에 대해 참이므로 isTrue는 참이 되고 ans가 1 증가합니다.
-그룹 문자가 아닌 예
-
word라는 변수가 있고 'appay'라는 값을 가지고 있습니다.
-
처음에 c는 'a'이며 i는 0, j는 3입니다.
-
word.count는 2를 반환하고 j-i+1은 4로 같지 않아 isTrue는 거짓이 되고 그룹 단어가 아닌 걸 판별했기 때문에 반복문을 나옵니다
위와 같이 만약 문자들이 옆으로 이어져 있다면 인덱스로 얻는 문자의 개수와 count는 같은 값을 가리켜야 하지만 그렇지 않다면 떨어져 있다고 판단할 수 있습니다.
{코드}
cnt = 0
for _ in range(int(input())):
word = input()
cnt+=list(word) == sorted(word, key=word.find)
print(cnt)
{설명}
조사하다보니 이런 코드도 있네요.
정렬 함수에 key를 find로 주면 문자열에 등장한 순서대로 정렬합니다.
즉 'aba'는 'aab'가 되는 것이죠.
아마 어떤 문자에 대해 계속 find를 하며 그 문자가 더 있는지 확인하며 정렬하는 것 같습니다.
'알고리즘 공부 > BOJ백준 풀이' 카테고리의 다른 글
[백준 2839번-파이썬/Python] 설탕 배달 (0) | 2020.10.15 |
---|---|
[백준 1712번-파이선/Python] 손익분기점 (0) | 2020.10.15 |
[백준 2941번-파이썬/Python] 크로아티아 알파벳 (0) | 2020.10.14 |
[백준 5622번-파이썬/Python] 다이얼 (0) | 2020.10.14 |
[백준 2908번-파이썬/Python] 상수 (0) | 2020.10.13 |