티스토리 뷰

프로그래머스 문제 정복기

 

카카오 인턴쉽 

 

난이도 : Lv1


🔗 Link


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

 

📑 Summary


 

 키패드 숫자 입력이 여러 개 들어왔을 때, 어느 손으로 해당 번호를 누르는지 순서대로 결과를 출력하는 문제이다.  

🔑 How to solve? 


문제의 조건에 따라 왼손과 오른손을 누르는 고정적인 경우와 가변적인 경우로 나누어 생각해보자.

 

1) 고정적인 경우

  • 왼손으로만 누르는 번호 : 1, 4, 7
  • 오른손으로만 누르는 번호 : 3, 6, 9

2) 가변적인 경우 (2,5,8,0)

  • case A. 입력 키패드에서 왼쪽과 오른쪽의 현재 위치까지의 거리가 다를 경우 -> 가까운 쪽의 손으로
  • case B. 입력 키패드에서 왼쪽과 오른쪽의 현재 위치까지의 거리가 같을 경우 -> 본인의 평소 쓰는 손으로

 

1)번의 경우, 해당 번호라면 눌러주면 된다. 고민을 해야 할 경우는 2) 번이다.

 

왜 가변적인 경우가 더 고려해야 할 상황이 많은가?

 일단, 입력 키패드에서 양 손의 현재 위치와의 거리차를 구해야 한다. 양손의 위치가 여러 가지 구간일 수 있으므로, 생각해야 할 부분이 많다. 그렇다면 어떻게 현재 위치까지의 거리를 쉽게 구할 수 있을까?

 

예를 들어 나타내 보자. 임의의 위치에 있는 왼손이 갈 수 있는 범위는 아래와 같다.

 현재 왼손이 왼쪽 키패드 열 쪽에 있다면(case1), 중앙으로 한 칸을 옮겨준 뒤, 세로 차만큼 이동해주면 거리를 계산할 수 있다. case 2번의 경우 세로 이동만 하면 되므로, 바로 세로 차만큼 이동해준다면 거리를 계산할 수 있다. 오른쪽도 이와 마찬가지로 계산을 해주면 된다.

 

해당 문제에서는 누가 더 가까운지 보면 되기 때문에 오른쪽과 왼쪽을 같은 방식으로 계산만 해준다면, 비교에는 문제가 없으나, 위로 움직이든, 옆으로 움직이든 같은 값으로 이동하고 싶다면 아래와 같이 표현할 수 있다.

#왼쪽이든 오른쪽이든 거리를 구하는 함수
def getCount(loc,num):
    cnt =0
    #첫번째 라인에 있을 경우( 중앙으로 밀어주기 위해 cnt+1)
    if loc %3 ==1 :
        cnt+=1
        loc+=1
    #세번째 라인 ( 중앙으로 밀어주기 위해 cnt+1)
    elif loc % 3 ==0:
        cnt+=1
        loc-=1
        
    #공통 로직 (세로는 3칸씩 증감하므로 3으로 나눈다면 동일한 칸수로 이동가능)
    cnt += int(abs(num-loc)/3)
    return cnt

 

위와 같은 형식으로 거리차를 구한 뒤, 같다면 평소에 쓰는 손으로 추가해주면 되고, 다르다면 가까운 손을 기입해주면 된다. 

 

💡 Code


#   Link
#   https://programmers.co.kr/learn/courses/30/lessons/67256

def solution(numbers, hand):
    answer = ''
    #현재 위치값 
    curL=10
    curR=12
    for num in numbers:
        if num in [1,4,7] :
            answer +='L'
            curL =num
        elif num in [3,6,9] :
            answer +='R'
            curR =num
        else :
        	#중앙인경우들의 계산
            
            # 계산의 편의를 위해 0을 실제위치인 11로 바꿈
            num = num if num != 0 else 11
            # 입력키패드와의 거리 계산
            Ldist = getCount(curL,num)
            Rdist = getCount(curR,num)
            
            #거리가 같을 경우
            if Ldist == Rdist :
                if hand == "left":
                    answer+= "L"
                    curL=num
                else:
                    answer+= "R"
                    curR=num
            else :
            #거리가 다를 경우
                if Ldist < Rdist:
                    answer+= "L" 
                    curL=num
                else :
                    answer+="R"
                    curR=num
            
    return answer

def getCount(loc,num):
    cnt =0
    #첫번째 라인
    if loc %3 ==1 :
        cnt+=1
        loc+=1
    #세번째 라인
    elif loc % 3 ==0:
        cnt+=1
        loc-=1
    cnt += int(abs(num-loc)/3)
    return cnt

 

 

After


현재 위치를 표현하기 위해 코드의 중복이 좀 심해 진부분이 불편했다. -_-;

 

 


포스팅에 문제가 있거나, 설명이 잘못된 부분 지적 환영합니다.

더 나은 퀄리티의 콘텐츠를 제공할 수 있도록 노력하겠습니다.

읽어주셔서 감사합니다. 

댓글
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2024/05   »
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
글 보관함