Programming/Coding Test

[Level 2] μ‘°μ΄μŠ€ν‹±

🌻Pep🌻 2020. 10. 28. 00:27
 

μ½”λ”©ν…ŒμŠ€νŠΈ μ—°μŠ΅ - μ‘°μ΄μŠ€ν‹±

μ‘°μ΄μŠ€ν‹±μœΌλ‘œ μ•ŒνŒŒλ²³ 이름을 μ™„μ„±ν•˜μ„Έμš”. 맨 μ²˜μŒμ—” A둜만 이루어져 μžˆμŠ΅λ‹ˆλ‹€. ex) μ™„μ„±ν•΄μ•Ό ν•˜λŠ” 이름이 μ„Έ κΈ€μžλ©΄ AAA, λ„€ κΈ€μžλ©΄ AAAA μ‘°μ΄μŠ€ν‹±μ„ 각 λ°©ν–₯으둜 움직이면 μ•„λž˜μ™€ κ°™μŠ΅λ‹ˆλ‹€. β–² - λ‹€

programmers.co.kr

 

def cnt_up_down(chr):
    cnt_from_a = abs(ord('A')-ord(chr))
    cnt_from_z = abs(ord('Z')-ord(chr)+1)
    
    return(min(cnt_from_a, cnt_from_z))

def solution(name):
    cnt = 0

    for i in name:
        cnt += cnt_up_down(i)

    lst_name = list(name)
    len_name = len(lst_name)
    
    
    if lst_name.count('A') == len_name:
        return 0

    cur = 0
    lst_name[cur] = 'A'
    

    while lst_name.count('A') != len_name:
        cnt_left = 0
        cnt_right = 0
    
        pos_right, pos_left = cur, cur

        for i in range(1, len_name):
            cnt_right += 1
            pos_right += 1
        
            if pos_right > len_name-1:
                pos_right -= len_name
            
            if lst_name[pos_right] != 'A':
                break
            
        for j in range(1, len_name):
            cnt_left += 1
            pos_left -= 1
        
            if pos_left < 0:
                pos_left += len_name
            
            if lst_name[pos_left] != 'A':
                break
            
        if cnt_right <= cnt_left:
            lst_name[pos_right] = 'A'
            cnt += cnt_right
            cur = pos_right
        else:
            lst_name[pos_left] = 'A'
            cnt += cnt_left
            cur = pos_left

    return cnt

 

β–· 이 λ¬Έμ œλŠ” 크게 μ‘°μ΄μŠ€ν‹±μ„ μœ„/μ•„λž˜λ‘œ μ›€μ§μ΄λŠ” κ²½μš°μ™€ 쒌/우둜 μ›€μ§μ΄λŠ” 경우둜 λ‚˜λˆ„μ–΄ ν’€μ–΄μ•Ό ν•œλ‹€. μœ„/μ•„λž˜λ‘œ μ›€μ§μ΄λŠ” νšŸμˆ˜λŠ” μ–΄λ– ν•œ κ²½μš°μ—λ„ κ°™λ‹€. λ”°λΌμ„œ 쒌/우의 이동을 μ€„μ—¬μ„œ μ΅œμ†Œμ˜ μ΄λ™νšŸμˆ˜λ‘œ λ§Œλ“œλŠ” 것이 핡심이닀.

 

β–· cnt_up_down ν•¨μˆ˜λŠ” λ¬Έμžμ— λŒ€ν•œ μœ„/μ•„λž˜λ‘œ 움직여야 ν•˜λŠ” 횟수λ₯Ό κ΅¬ν•˜λŠ” ν•¨μˆ˜μ΄λ‹€.

 

β–· μœ„ μ½”λ“œμ˜ 논리λ₯Ό μš”μ•½ν•˜λ©΄ λ‹€μŒκ³Ό κ°™λ‹€.

 

1. cnt_up_down ν•¨μˆ˜λ₯Ό μ΄μš©ν•˜μ—¬ μœ„/μ•„λž˜λ‘œ μ›€μ§μ΄λŠ” 횟수λ₯Ό κ΅¬ν•œλ‹€.

2. 첫 번째 μœ„μΉ˜μ˜ 문자λ₯Ό A둜 λ³€κ²½ν•œλ‹€.

3. 첫 번째 μœ„μΉ˜λ₯Ό ν˜„μž¬ μœ„μΉ˜λ‘œ μ •ν•œ λ’€, μ™Όμͺ½μœΌλ‘œ μ΄λ™ν•˜λŠ” κ²½μš°μ™€ 였λ₯Έμͺ½μœΌλ‘œ μ΄λ™ν•˜λŠ” 경우의 μ΄λ™νšŸμˆ˜λ₯Ό λΉ„κ΅ν•œλ‹€. μ΄λ•Œ λ‘˜ 쀑 μž‘μ€ μ΄λ™νšŸμˆ˜λ₯Ό 전체 μ΄λ™νšŸμˆ˜μ— μΆ”κ°€ν•˜κ³ , ν˜„μž¬ μœ„μΉ˜λ₯Ό ν•΄λ‹Ή 이동을 λ°˜μ˜ν•˜μ—¬ λ³€κ²½ν•œλ‹€. μ΄λ•Œ λ³€κ²½λœ ν˜„μž¬μœ„μΉ˜μ˜ 문자λ₯Ό A둜 λ³€κ²½ν•œλ‹€.

4. name λ³€μˆ˜μ˜ λͺ¨λ“  λ¬Έμžκ°€ Aκ°€ 될 λ•ŒκΉŒμ§€ 3번 μž‘μ—…μ„ λ°˜λ³΅ν•œλ‹€.