알파뱃이 연속해서 나오는 aaawwwrit와 같은 것을 그룹 단어라고 한다.
예를들어 aaawweeaa와 같이 a가 따로 떨어져 있는 경우는 그룹단어가 아니다.
count값을 N으로 시작해서 그룹 단어의 숫자만큼 하나씩 빼는 방법 (count = 0으로 시작, for문을 돌며 count -= 1)
count값을 0으로 시작해서 그룹 단어의 숫자만큼 하나씩 더하는 방법 (count = N으로 시작, for문을 돌며 count += 1)
이 두가지가 떠오른다.
여기서는 우선 하다가 빼는 방법과 더하는 방법 중 쉬운 쪽을 선택할 생각이다.
인풋값 N을 입력하면
인풋 값 만큼 예제가 입력 되므로 for _ in range(N): N번 만큼 반복하라
반복 된 만큼 단어가 input되기 때문에 이 for문 안에 새로운 단어 input을 해준다.
word = input()
이제부터 어려워지는데 "입력되는 단어가 그룹 단어인지 어떻게 판별하는가"에 해당하는 것을 풀어야한다.
방법은 다양하겠지만 나는 여기서 for문과 find 함수를 이용하려고 한다.
find 함수는 해당하는 값을 찾아 주는 함수로서
find(찾을문자, 찾기시작할위치)와 같은 형태로 사용한다. 만약 찾기시작할 위치를 지정하지 않을 경우 첫번째부터 찾게된다. find 대신 index를 이용해도 마찬가지의 결과가 나올 것이다.
입력한 단어에서 앞글자와 그 뒤에오는 글자의 첫번째 찾은 값을 비교한다. (말이 설명하기 어렵고 이해하기도 어려우니 예시로 본다.)
N값에 임의로 2를 넣고
word 값에 'qwerty', 'banana' 를 넣어봤다. 'qwerty'는 따로 떨어져 있는 문자가 없는 그룹 문자이고, 'banana'는 그룹 문자가 아니다. banana에서 i가 ba'n'ana의 n부분에 왔을 때 n은 처음 나오는 단어라 0, 1, 2 총 세번째에서 처음 나왔다고 find가 되는데 i+1은 a로 a는 0,1 두번째에서 처음 나왔기 때문에 1이 출력되었다.
이것으로 word.find(word[i])의 값이 word.find(word[i+1])보다 큰 경우가 하나라도 있으면 그룹 문자가 아님을 알 수 있다. 이렇게 판별한 단어의 수를 count 해서 출력해주면 우리가 문제에서 원하는 출력을 줄 수 있다.
ㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡ
아래부터는 여담이다.
word.find(word[i])의 값이 word.find(word[i+1])과 비교했을 때 모두 작거나 같을 경우 그룹 문자일 것이다.
"대우 조건이 아닌 역조건으로 작거나 같은 경우가 하나라도 있을 때 그룹 문자일까?"라고 단순히 해본 결과 그렇게 간단하지 않았다.
# word.find(word[i])의 값이 word.find(word[i+1])보다 작거나 같을 경우 그룹 문자라고 두고 count = 0에서 1씩 늘려봤는데 제대로 카운트가 되지 않았다. 대우 명제가 a<b 이면 a>=b가 아니라 a여집합 >= b여집합 인 것은 알겠는데 이 경우 전체 집합을 알아야만 동작 할 수 있다는 뜻이 된다. 그렇다면 그룹문자를 판단하는 것보다 그룹 문자가 아닌 것을 판단하는게 훨씬 쉬워보인다.
break는 꼭 넣어줘야한다. break를 뺄 경우 하나의 word에서 word.find(word[i]) > word.find(word[i+1]) 인 조건이 여러개 일 경우 나올 때 마다 count를 해주기 때문에 반드시 필요하다!
'알고리즘' 카테고리의 다른 글
백준 2839 설탕 배달 [지극히 개인적인 풀이 과정] 실패의 연속 (0) | 2021.06.17 |
---|---|
백준 2941 크로아티아 알파벳 [문제 풀이] (0) | 2021.06.16 |
백준 4344번 문제 : 평균은 넘겠지 [지극히 개인적인 풀이 과정] (0) | 2021.06.15 |
백준 1110번 문제 [지극히 개인적인 풀이 과정] (0) | 2021.06.14 |
백준 2588번 문제 지극히 개인적인 풀이 과정 (0) | 2021.06.14 |