티스토리 뷰

Programmers 의 코딩테스트 연습 탐욕법 중 Level.2 조이스틱

 

위아래로 움직여서 알파벳을 조정해주는 al_cnt과, 좌우로 움직여서 위치를 이동하는 move_cnt 두 가지를 따로 계산해서 answer에 합쳐주었다. 

 

 

1. 조이스틱 상하 조종 - 알파벳 

 

상하로 움직였을 때 알파벳을 계산할 때는, 각 알파벳이 가리키는 아스키코드를 활용했다. 

아스키코드로 A가 65, Z가 90. 그리고 가운데에 속하는 M,N이 각각 77, 78 이다.

ord('A')=65 이런식으로 구할 수 있다.

A부터 M까지는 조이스틱 위로 하나씩 늘어나고, Z부터 N까지는 조이스틱 아래로 조종하여 al_cnt가 늘어나도록 한다.

1
2
3
4
5
6
7
8
al_cnt,move_cnt=0,0
    name_len=len(name)
    name_list=list(name)
    for i in name_list: 
        if 65<=ord(i)<=77:
            al_cnt+=ord(i)-65
        elif 77<ord(i)<=90:
            al_cnt+=91-ord(i)

 

2. 조이스틱 좌우 조종 - 위치

위치를 조종해주는 것은 약간 복잡했다.

자꾸 몇몇 케이스가 안된다고 떠서 if 문으로 상황을 나누어 처리해주었다.

일단 A가 아닌 알파벳들의 인덱스를 notA_list에 저장해주었다.

j는 현재위치, max1, min1은 notA_list에서 가장 작고, 큰 인덱스를 가리키는데 이 둘과 j와의 거리를 max_j, min_j 로 구해서 이 둘을 비교할 것이다. 

만약 min_j가 작다면 min_j 쪽으로 가면되고, max_j가 작으면 max_j 쪽으로 이동하면 되는 것이다.

min_j와 max_j를 구하는 과정에서, j와 min1의 위치에 따라 음수가 나올 수 있으므로 abs()로 절대값으로 처리하였다.

max_j를 구할 때는 j가 max1보다 앞에 있을 때와 뒤에 있을 때의 값이 다르게 나와야 해서 if 문으로 두 가지를 따로 처리하였다.

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
if 'A' not in name_list:
        move_cnt+=name_len-1
    
    if 'A' in name_list:
    
        notA_list=[] #name_list에서 A아닌 것들의 인덱스
        for i in range(name_len):
            if name_list[i]!='A':
                notA_list.append(i)
                type(notA_list)
        j,min1,max1=0,0,0
        while(len(notA_list)!=0):
            min1=min(notA_list)
            max1=max(notA_list)
            min_j=abs(min1-j)
 
            if j>=max1:
                max_j=j-max1
            elif j<max1:
                max_j=name_len-max1+j
            if min_j<=max_j:
                print("min_j,max_j:",min_j,max_j)
                move_cnt+=min_j
                notA_list.remove(min1)
                if j==min1 and j==0:
                    j=min1
                else:
                    j=min1
 
            elif min_j>max_j:
                print("min_j,max_j:",min_j,max_j)
                move_cnt+=max_j
                notA_list.remove(max1)
                j=max1
 
                
  
http://colorscripter.com/info#e" target="_blank" style="color:#4f4f4ftext-decoration:none">Colored by Color Scripter

 

<전체 코드>

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
def solution(name):
    answer = 0
    al_cnt,move_cnt=0,0
    name_len=len(name)
    name_list=list(name)
    
    #상하이동 al_cnt
    for i in name_list: 
        if 65<=ord(i)<=77:
            al_cnt+=ord(i)-65
        elif 77<ord(i)<=90:
            al_cnt+=91-ord(i)
 
    
    #좌우이동 move_cnt
    if 'A' not in name_list:
        move_cnt+=name_len-1
    
    if 'A' in name_list:
    
        notA_list=[] #name_list에서 A아닌 것들의 인덱스
        for i in range(name_len):
            if name_list[i]!='A':
                notA_list.append(i)
                type(notA_list)
        j,min1,max1=0,0,0
        while(len(notA_list)!=0):
            min1=min(notA_list)
            max1=max(notA_list)
            min_j=abs(min1-j)
 
            if j>=max1:
                max_j=j-max1
            elif j<max1:
                max_j=name_len-max1+j
            if min_j<=max_j:
                move_cnt+=min_j
                notA_list.remove(min1)
                if j==min1 and j==0:
                    j=min1
                else:
                    j=min1
 
            elif min_j>max_j:
                move_cnt+=max_j
                notA_list.remove(max1)
                j=max1
 
                
    answer=al_cnt+move_cnt
    return answer