HackerRank Sherlock and the Valid String

x·2021년 5월 8일
0

problem-solving

목록 보기
17/18

유효한 문자열 : 문자열에 존재하는 문자의 개수가 모두 동일
유효한 문자열을 만들기 위해 제거해야하는 문자의 개수가 1개 이하인 경우 return YES, 아니면 NO

Counter()로 문자열의 문자 빈도수를 구한다
빈도수를 set()으로 묶어 기준으로 삼는다
기준값을 돌면서 제거된 개수는 0으로 초기화해준다
문자 빈도수랑 기준값을 비교해서 다른 경우는 값을 제거해야 한다
제거해야 할 개수를 구할 때 기준값과 빈도수의 차이를 구하는데 차이보다 빈도수가 적다면 빈도수만큼 제거한다. remove_count에 그 값을 누적해준다
빈도수를 다 돌았으면 제거된 수가 1 이하인지 판단하고 참이라면 유효한 문자열이므로 YES 반환한다
기준값을 다 돌고도 YES가 아니라면 기준값마다 제거해야 할 문자 수가 2 이상이므로 NO 반환한다

test case

4 : aabbc YES
5 : aaaaabc NO
18 : abcdefghhgfedecba YES

#!/bin/python3

import os
from collections import Counter


def is_valid(s):
    s_counter = Counter(s)
    standard = set(s_counter.values())
    for std in standard:
        remove_count = 0
        for v in s_counter.values():
            if std != v:
                diff = abs(std - v)
                if diff > v:
                    remove_count += v
                else:
                    remove_count += diff
        if remove_count < 2:
            return "YES"
    return "NO"


if __name__ == "__main__":
    fptr = open(os.environ["OUTPUT_PATH"], "w")

    s = input()

    result = is_valid(s)

    fptr.write(result + "\n")

    fptr.close()

0개의 댓글