Algorithm/String

[HackerRank] Two Characters

킹우현 2023. 5. 19. 18:13

def alternate(s):
    # Write your code here
    result_list = []
    
    def gen_comb(arr,n):
        result = []
        if n == 0:
            return [[]]
        for i in range(len(arr)):
            element = arr[i]
            rest_arr = arr[i+1:]
            
            for c in gen_comb(rest_arr,n-1):
                result.append([element]+c)
                
        return result
        
    def validate(arr):
        length = len(arr)
        if length >=2:
            first, second = arr[0],arr[1]
            for j in range(length):
                if j%2 == 0 and arr[j] != first:
                    return False
                if j%2 == 1 and arr[j] != second:
                    return False
            return True
        else:
            return True

    char_list = list(s) # [b,e,a,b,e,e,f,e,a,b]
    char_set = set(char_list) # {a,b,e,f}
    
    set_to_arr = list(char_set) # [a,b,e,f]
    
    com_list = gen_comb(set_to_arr,2)
    #[['a', 'b'], ['a', 'e'], ['a', 'f'], ['b', 'e'], ['b', 'f'], ['e', 'f']]
    
    for i in com_list: # ['a','b']
        temp_string = char_list.copy() # [b,e,a,b,e,e,f,e,a,b]
        append_string = [] 
        for j in range(len(temp_string)):
            if temp_string[j] in i:
                append_string.append(temp_string[j])
        result_list.append(append_string)
        
    result_list = [x for x in result_list if validate(x)]
    #[['b', 'e', 'b', 'e', 'e', 'e', 'b'], ['b', 'a', 'b', 'a', 'b'], ['e', 'a', 'e', 'e', 'e', 'a'], ['b', 'b', 'f', 'b'], ['e', 'e', 'e', 'f', 'e'], ['a', 'f', 'a']]

    result = [len(x) for x in result_list]
    if len(result) >= 1:
        solution = max(result)
    else:
        solution = 0
        
    return solution

이번 문제는 주어진 문자열에 존재하는 문자 중 2개만 남겼을 때, 두가지 값이 반복되는 형태의 문자열 중에서 가장 길이가 긴 문자열의 길이를 구하는 문제이다.

 

처음에 문제를 이해를 하기 어려워서 예제에 대한 설명을 읽었는데, 그 설명 그대로 구현하니 풀 수 있었다.

 

먼저 주어진 문자열에 존재하는 문자의 종류를 알기 위해 set 자료형list 자료형을 사용하였고, 2가지를 선택하는 경우의 수를 구하기 위하여 조합을 구하는 함수(gen_comb)를 만들었다.

 

또한 2가지만 남겼을 때 값이 번갈아가는지 검증하기 위한 함수(validate)를 구현하여 리스트 컴프리핸션을 통해 최종적인 답을 구할 수 있었다.

 

이번 문제를 풀면서 느낀 점은 다음과 같다 :)

  1. 문제의 로직이 복잡할 경우에는 print를 찍어보면서 해당 값을 주석으로 남기면서 풀자.(헷갈리는 것을 방지)
  2. 문제를 효율적으로 풀기 위해서는 set, list, dict 자료형을 적극적으로 활용하고 최대한 로직을 함수화하자.
  3. 문제가 제대로 이해가지 않는다면 문제의 예제를 유심히 살펴보자.