본문 바로가기
알고리즘&자료구조(algorithm& data structure)/프로그래머스(programmers)

[프로그래머스 / 고득점 kit] 탐욕법: 조이스틱- ver 1

by 바코94 2019. 7. 24.

스틱 움직임을 시작시에 오른쪽과 왼쪽으로 구분하여 풀어가면서 더 복잡해 지는 경우가 발생한다.

1.오른쪽으로 가다가 왼쪽으로 되돌아 가는경우.

2.왼쪽으로 가다가 오른쪽으로 되돌아 가는경우.

 

해결 : 애초에 오른쪽으로 가는것을 기준으로 하고 되돌아 가야 할 때 되돌아 가도록 짜면 될 것 같다.

 

코드 첨부: 

 

i = 0 
alpha_dict = {}
for x in "ABCDEFGHIJKLMNOPQRSTUVWXYZ":
    if i <= 13:
        alpha_dict[x] = i
    else:
        alpha_dict[x] = 26-i
    i +=1

def solution(name):
    answer = 0
    
    # if len(name) ==1 
    if len(name) == 1:
        return alpah[name[0]]
    
    len_name = len(name)
    left_A_count, right_A_count = check_A_count(name)

    answer += alpha_dict[name[0]]
    
    if left_A_count <= right_A_count:
        
        answer += left_moving_function(name,0,len_name)
            # if i+1 < check_moving_cnt[lst[i+1:]] :
                         
    else :
        answer += right_moving_function(name,1,len_name)
    return answer

def right_moving_function(name, left_border_index, right_border_index):
    answer = 0 
    i = right_border_index
    print(i)
    while i > left_border_index and  name[left_border_index:i].count('A') != len(name[left_border_index:i]):

        i -= 1
        # next alphabet
        answer +=1

        # find alphabet
        answer += alpha_dict[name[i]]
    
    return answer 
    
def left_moving_function(name, left_border_index, right_border_index):
    answer = 0
    i = left_border_index
    while (i < right_border_index-1 ) and  (name[i+1:right_border_index].count('A') != len(name[i+1:right_border_index])):

        i += 1
        # next alphabet
        answer +=1
        # find alphabet
        answer += alpha_dict[name[i]]
        
    return answer 

def check_moving_cnt_to_left(lst):
    index_list = [i for i in range(len(lst)-1,-1,-1) if lst[i] != 'A']
    return index_list[0]+1

def check_moving_cnt_to_right(lst):
    index_list = [i for i in range(len(lst)) if lst[i] != 'A']
    return index_list[0]+1
    
def check_A_count(lst):
    # check A count
    len_lst = len(lst)
    # print("len_name:",len_name)
    half_size = int((len_lst+1)/2) 

     # if len(name) -1 is even
    if (len_lst-1) % 2 == 0:
        
        # make [1:half_size]
        half_left_list = lst[1:half_size]
        
        # make [half_size:]
        half_right_list = lst[half_size:]
    else:
        
        # make [1:half_size]
        half_left_list = lst[1:half_size]
        
        # make [half_size:]
        half_right_list = lst[half_size+1:]

    left_A_count = half_left_list.count('A')
    right_A_count = half_right_list.count('A')
    
    return left_A_count, right_A_count