본문 바로가기
알고리즘 문제풀이/코딜리티

Codility Exercise4

by Hoseok 2023. 6. 22.
728x90
반응형

First Unique

 

코드

 

from collections import Counter

def solution(A):

    my_cnt = Counter(A)

    for i in my_cnt.keys():
        if my_cnt[i] == 1:
            return i

    return -1

 

StrSymmetryPoint

 

코드

 

def solution(S):
    if len(S) == 1:
        return 0

    if len(S) % 2 == 0:
        return -1

    for i in range(len(S) // 2):
        if S[i] != S[-(i+1)]:
            return -1

    return len(S) // 2

    return cnt

 

 

TreeHeight

 

 

코드

 

from extratypes import Tree  # library with types used in the task

def solution(T):
    def calculate_height(T):
        if T is None:
            return -1
        else:
            left_height = calculate_height(T.l)
            right_height = calculate_height(T.r)
            return max(left_height, right_height) + 1

    return calculate_height(T)

 

ArrayInversionCount

 

코드

 

이중 for문으로 풀면 범위가 크기 때문에 시간 초과가 난다.

 

병합정렬을 사용해야 한다.

 

def solution(A):
    # 병합 정렬과 인버전 개수 계산을 위한 보조 함수
    def merge_sort_and_count(arr):
        if len(arr) <= 1:
            return arr, 0
        
        mid = len(arr) // 2
        left, count_left = merge_sort_and_count(arr[:mid])
        right, count_right = merge_sort_and_count(arr[mid:])
        merged, count = merge_and_count(left, right)
        
        return merged, count + count_left + count_right
    
    # 병합과 인버전 개수 계산을 위한 보조 함수
    def merge_and_count(left, right):
        merged = []
        count = 0
        i = j = 0
        
        while i < len(left) and j < len(right):
            if left[i] <= right[j]:
                merged.append(left[i])
                i += 1
            else:
                merged.append(right[j])
                count += len(left) - i  # 인버전 개수 계산
                j += 1
        
        merged.extend(left[i:])
        merged.extend(right[j:])
        
        return merged, count
    
    # 병합 정렬과 인버전 개수 계산 수행
    sorted_A, inversions = merge_sort_and_count(A)
    
    # 인버전 개수가 1,000,000,000을 초과하는 경우 -1 반환
    if inversions > 1000000000:
        return -1
    
    return inversions

 

DisappearingPairs

 

코드

 

def solution(S):
    stack = []

    for char in S:
        if len(stack) >= 1 and stack[-1] == char:
            stack.pop()
        else:
            stack.append(char)

    return ''.join(stack)

 

시간초과났던 코드

 

def solution(S):
    if len(S) == 0:
        return S

    my_list = list(S)
    
    for i in range(len(my_list) - 1):
        if my_list[i] == 'A' and my_list[i+1] == 'A':
            index = [i, i+1]
            index.sort(reverse = True)
            for i in index:
                del my_list[i]
            return solution(''.join(my_list))
        if my_list[i] == 'B' and my_list[i+1] == 'B':
            index = [i, i+1]
            index.sort(reverse = True)
            for i in index:
                del my_list[i]
            return solution(''.join(my_list))
        if my_list[i] == 'C' and my_list[i+1] == 'C':
            index = [i, i+1]
            index.sort(reverse = True)
            for i in index:
                del my_list[i]
            return solution(''.join(my_list))
        
    return ''.join(my_list)
728x90
반응형