알고리즘/프로그래머스

2020카카오 인턴십 문제 : 키패드 누르기

글을 쓰는 개발자 2021. 1. 26. 21:54
반응형
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
52
53
54
def solution1(numbers, hand):
    answer = ''
    flag=False
    if hand=='right':
        flag=True
    else:
        flag=False
    pad={}
    pad[1]='00'
    pad[2]='01'
    pad[3]='02'
    pad[4]='10'
    pad[5]='11'
    pad[6]='12'
    pad[7]='20'
    pad[8]='21'
    pad[9]='22'
    pad[0]='31'
    leftStart=[3,0]
    rightStart=[3,2]
    for number in numbers:
        if number in [1,4,7]:
            answer+='L'
            leftStart[0]=int(pad[number][0])
            leftStart[1]=int(pad[number][1])
        elif number in [3,6,9]:
            answer+='R'
            rightStart[0]=int(pad[number][0])
            rightStart[1]=int(pad[number][1])
        else:
            valX=int(pad[number][0])
            valY=int(pad[number][1])
            leftTotal=int(abs(leftStart[0]-valX))+int(abs(leftStart[1]-valY))
            rightTotal=int(abs(rightStart[0]-valX))+int(abs(rightStart[1]-valY))
            if leftTotal==rightTotal:
                if flag:
                    answer+='R'
                    rightStart[0]=int(pad[number][0])
                    rightStart[1]=int(pad[number][1])
                else:
                    answer+='L'
                    leftStart[0]=int(pad[number][0])
                    leftStart[1]=int(pad[number][1])
            else:
                if leftTotal<rightTotal:
                    answer+='L'
                    leftStart[0]=int(pad[number][0])
                    leftStart[1]=int(pad[number][1])
                else:
                    answer+='R'
                    rightStart[0]=int(pad[number][0])
                    rightStart[1]=int(pad[number][1])
        
    return answer
cs

위의 코드는 처음 제출한 코드이다.

여기서 우선 수정해야 할 부분은 key,value 매핑하는 부분에서 저렇게 일렬로 쭉 나란히 쓰는 것보다는 { } 여기 안에 key:(value1,value2) 구조로 작성했으면 더욱 깔끔 했을 것 같다.

그리고 처음에 왼손 오른손 좌표를 리스트를 표현했는데 이것도 그냥 처음에 pad에서 '*','#' 의 value를 설정함으로써 그 이후의 for문에서 key값을 찾아서 value를 가져오는 식으로 했다면 코드가 더욱 더 심플했을 것이다.

그 이외에는 괜찮은 것 같다.

 

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
def solution(numbers, hand):
    answer = ''
    key_dict = {1:(0,0),2:(0,1),3:(0,2),
                4:(1,0),5:(1,1),6:(1,2),
                7:(2,0),8:(2,1),9:(2,2),
                '*':(3,0),0:(3,1),'#':(3,2)}
 
    left = [1,4,7]
    right = [3,6,9]
    lhand = '*'
    rhand = '#'
    for i in numbers:
        if i in left:
            answer += 'L'
            lhand = i
        elif i in right:
            answer += 'R'
            rhand = i
        else:
            curPos = key_dict[i]
            lPos = key_dict[lhand]
            rPos = key_dict[rhand]
            ldist = abs(curPos[0]-lPos[0]) + abs(curPos[1]-lPos[1])
            rdist = abs(curPos[0]-rPos[0]) + abs(curPos[1]-rPos[1])
 
            if ldist < rdist:
                answer += 'L'
                lhand = i
            elif ldist > rdist:
                answer += 'R'
                rhand = i
            else:
                if hand == 'left':
                    answer += 'L'
                    lhand = i
                else:
                    answer += 'R'
                    rhand = i
 
    return answer
cs

위의 코드는 프로그래머스에서 상위권에 속한 코드이다.

이걸 보고 사전 값을 디폴트로 저장할 때 저런 식으로 하면 되겠다 하고 생각했다.

반응형