HackerRank Sherlock and Anagrams

x·2021년 5월 2일
0

problem-solving

목록 보기
11/18

anargam : 문자열을 재정렬해서 다른 뜻을 가지는 글자로 바꾸는 것

아이디어 : 입력된 문자열의 길이를 length라고 한다. 문자열의 길이를 1~length까지 잘라 나올 수 있는 경우를 모두 구한다. 각 문자열을 정렬해서 dict의 key로 만들고 개수를 누적한다. 누적된 개수로 애너그램을 만들 수 있는 총 개수를 구한다.

1~length까지 cut을 정해놓는다. cut이 길어지는 만큼 for문에서 index i의 최대값을 점점 줄어야하므로 length-count+1 해준다.
잘려진 sub를 dict key로 만들고 누적하기 위해 to_dict를 호출한다.

각 key의 값(n)으로 만들 수 있는 애너그램 조합은 (n-1) + (n-2) ... + 1이다

#!/bin/python3

import os


def sherlock_and_anagrams(s: str):
    length = len(s)
    ana_dict = {}
    cut = 0
    anagrams = 0

    while cut < length:
        cut += 1
        for i in range(0, length - cut + 1):
            sub = s[i:i+cut]
            to_dict(ana_dict=ana_dict, sub=sub)

    for v in ana_dict.values():
        for i in range(1, v):
            anagrams += i

    return anagrams


def to_dict(ana_dict: dict, sub: str):
    sorted_sub = str(sorted(sub))

    if sorted_sub in ana_dict:
        ana_dict[sorted_sub] += 1
    else:
        ana_dict[sorted_sub] = 1


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

    q = int(input().strip())

    for q_itr in range(q):
        s = input()

        result = sherlock_and_anagrams(s=s)

        fptr.write(str(result) + '\n')

    fptr.close()

0개의 댓글