국문과 유목민

40. 키패드 누르기 본문

알고리즘_코딩테스트/프로그래머스_Level1

40. 키패드 누르기

논곰 2020. 9. 12. 23:55

0. 문제

링크) https://programmers.co.kr/learn/courses/30/lessons/67256

 

코딩테스트 연습 - 키패드 누르기

[1, 3, 4, 5, 8, 2, 1, 4, 5, 9, 5] "right" "LRLLLRLLRRL" [7, 0, 8, 2, 8, 3, 1, 5, 7, 6, 2] "left" "LRLLRRLLLRR" [1, 2, 3, 4, 5, 6, 7, 8, 9, 0] "right" "LLRLLRLLRL"

programmers.co.kr


1. 알고리즘 계획

  1. 각 키패드의 규칙을 확인 (3으로 나눴을 때 나머지가 동일하게 나타난다.)
  2. 그 규칙을 토대로 배열의 행과 열 위치를 설정한다.
  3. Left규칙과 Right규칙을 설정한다. 
  4. 만약 Mid에 위치한 번호를 누를 경우 '왼손과 오른손 각 위치의 행과 열값'을 '눌러야 하는 번호의 행과 열 값'을 각각 계산해서 비교한다. (계산은 절대값으로 해야 한다.)
  5. 각각의 번호를 누르면서 answer변수에 눌렀던 손의 번호를 저장한다.


2. 나의 코드

def solution(numbers, hand):
    answer = ""
    LH = [3, 0]
    RH = [3, 2]
    for v in numbers:
        if v % 3 == 1:
            LH = [v//3, (v+2) % 3]
            answer+="L"
        elif v % 3 == 0 and v != 0:
            RH = [v//3-1, (v+2) % 3]
            answer+="R"
        else:
            if v == 0:
                mid = [3, 1]
            else:
                mid = [v//3, (v+2) % 3]
            LH_dist = abs(LH[0]-mid[0])+abs(LH[1]-mid[1])
            RH_dist = abs(RH[0]-mid[0])+abs(RH[1]-mid[1])
            if LH_dist == RH_dist:
                if hand == "right":
                    RH = mid
                    answer+="R"
                else:
                    LH = mid
                    answer+="L"
            elif LH_dist < RH_dist:
                LH = mid
                answer+="L"
            else:
                RH = mid
                answer+="R"
    return answer

- 스스로 나쁘지 않게 작성한 코드라는 생각을 했다.

- 하지만 (어쩔 수 없는 것이겠지만) if-else구문이 너무 많아 직관적으로 보이게 만들지 못했다는 점에서 살짝 아쉽다.


3. 다른 사람의 코드

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

- dict객체를 이용한 풀이

- 나와 방식은 비슷하지만, 내가 키패드에서 규칙을 찾아내고자 했던 것과 달리 dict에 각각의 행렬값을 입력해줬다.

- 하지만 코드는 오히려 깔끔해보인다.


4. 정리 및 리뷰

- 내심 문제가 어려워지고 코드가 복잡해질 수록 'dict'자료형의 사용빈도가 올라가는 것 같다고 막연히 생각했는데, 확실히 많이 보이는 것 같다.

- dict자료형을 쉽게 사용할 수 있게 공부해야겠다.

- 이번 코드는 예전에는 어려웠다고 생각했던 문제였는데, 비교적 잘 푼 것 같아서 뿌듯하다.


코드 만족도: ★★★


'알고리즘_코딩테스트 > 프로그래머스_Level1' 카테고리의 다른 글

39. 다트확률 구하기  (0) 2020.09.12
38. 실패율  (0) 2020.09.12
37. 비밀지도 찾기  (0) 2020.09.12
36. 예산  (0) 2020.09.12
35. 별 찍기  (0) 2020.09.12
Comments