문자열, 암호가 있다고 가정합니다. 암호를 강력하게 만드는 데 필요한 최소한의 변경 사항을 찾아야 합니다. 따라서 비밀번호에는 다음과 같은 몇 가지 기준이 있습니다 -
- 최소 6자, 최대 20자
- 최소 1개의 소문자, 1개의 대문자, 1개 이상의 숫자를 포함해야 합니다.
- …aaa…, …PPP…, …888…
따라서 입력이 "aa26bbb"와 같으면 대문자가 없고 연속으로 3개의 b가 있으므로 적어도 하나의 변경이 필요하므로 b를 하나의 대문자로 바꿔 강력하게 만들 수 있습니다.
이 문제를 해결하기 위해 다음 단계를 따릅니다. −
- missingTypes 설정 :=3.
- 소문자가 하나 이상 있는 경우 missingTypes를 1 감소
- 대문자가 하나 이상 있으면 missingTypes를 1 감소
- 숫자가 하나 이상 있으면 missingTypes를 1 감소
- 변경 :=0, 하나 :=0 및 둘 :=0, p :=2
- p
- s[p]가 s[p – 1]과 같고 이것도 s[p – 2]와 같으면
- 길이:=2
- p
- 길이 :=길이 + 1
- p :=p + 1
- 변경 :=변경 + 길이 / 3
- 길이가 3의 배수이면 1씩 증가
- 그렇지 않으면 길이가 3의 배수이면 2를 1로 늘립니다.
- s[p]가 s[p – 1]과 같고 이것도 s[p – 2]와 같으면
- 삭제 :=s – 20의 크기
- change :=change – 최소 삭제 및 하나
- 변경 :=변경 – (최소(최대 삭제 – 1 및 0) 및 2 * 2)/2
- 변경 :=변경 – (최대 삭제 – 1 – 2 * 2 및 0)/2
이해를 돕기 위해 다음 구현을 살펴보겠습니다. −
예
class Solution(object): def strongPasswordChecker(self, s): missing_type = 3 if any('a' <= c <= 'z' for c in s): missing_type -= 1 if any('A' <= c <= 'Z' for c in s): missing_type -= 1 if any(c.isdigit() for c in s): missing_type -= 1 change = 0 one = two = 0 p = 2 while p < len(s): if s[p] == s[p-1] == s[p-2]: length = 2 while p < len(s) and s[p] == s[p-1]: length += 1 p += 1 change += length / 3 if length % 3 == 0: one += 1 elif length % 3 == 1: two += 1 else: p += 1 if len(s) < 6: return max(missing_type, 6 - len(s)) elif len(s) <= 20: return max(missing_type, change) else: delete = len(s) - 20 change -= min(delete, one) change -= min(max(delete - one, 0), two * 2) / 2 change -= max(delete - one - 2 * two, 0) / 3 return delete + max(missing_type, change) ob = Solution() print(ob.strongPasswordChecker('aa26bbb'))
입력
“aa26bbb”
출력
1