[백준 1316번-파이썬/Python] 그룹 단어 체커
알고리즘 공부/BOJ백준 풀이

[백준 1316번-파이썬/Python] 그룹 단어 체커

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를 하며 그 문자가 더 있는지 확인하며 정렬하는 것 같습니다.