Algorithm/프로그래머스

프로그래머스 키패드 누르기 문제풀이- [세무민의 코딩일기]

세기루민 2022. 2. 20. 19:15
728x90

안녕하세요 세기무민입니다.

이번에 돌아온 포스팅은 프로그래머스 알고리즘 풀이 문제로 돌아왔습니다. 

 

 

문제설명

 

입출력 예시

 

문제풀이

우선 저는 이 문제를 보자마자 메모장에 그림을 그렸습니다. 

전화기가 위와 같이 있다고 가정하면 일단 왼쪽의 숫자들은 3으로 나눴을 때 나머지가 1인 경우의 수

오른쪽의 숫자들은 3으로 나눴을 때 나머지가 0인 경우의 수라는 것을 알 수 있습니다.

그런 뒤 이 문제에서 가장 중요한건 가운데 숫자를 클릭하는 방법인데

우선은 가운데 숫자들은 3가지의 조건을 생각해봤습니다. 

1. 왼쪽과 오른쪽의 길이가 같은 경우 

2. 왼쪽이 오른쪽 길이보다 큰 경우 

3. 오른쪽이 왼쪽 길이보다 큰 경우 

위와 같이 3가지로 나눌 수 있는데 그렇다면 어떻게 길이를 구분할 지 고민해본 끝에 좌표 이동을 생각해봤는데 

아래의 예를 들어보겠습니다. 

위와 같은 그림을 보면 5에 가장 가까운 번호는 4가 됩니다. 

좌표로 생각해봐도 left가 1칸만 이동하는 경우라면  center에 도착할 수 있는 반면 right는 위, 옆으로 

총 2칸을 이동해야 하기 때문에 left가 가까운 번호가 됩니다. 

결론적으로는 현재의 center값에서 left와 right값을 뺀 결과에 거리를 구한다면 가장 단거리를 구할 수 있습니다. 

코드

 

def solution(numbers, hand):
    leftHand = 10
    rightHand = 12
    lx, rx = 0, 0, 0
    ly, ry = 0, 0, 0
    leftDis = 0
    rightDis = 0

    result = ""

    for i in numbers:
        if i == 0:
            i = 11
        if i == "#":
            i = 12
        if i == "*":
            i = 10

        if i % 3 == 1:
            result += "L"
            leftHand = i 

        elif i % 3 == 0:
            result += "R"
            rightHand = i
        else:
            lx = (abs(i - leftHand)) // 3
            ly = (abs(i - leftHand)) % 3
            rx = (abs(i - rightHand)) // 3
            ry = (abs(i - rightHand)) % 3
            leftDis = (lx + ly)
            rightDis = (rx + ry)

            if leftDis > rightDis:
                result += "R"
                rightHand = i
            elif rightDis > leftDis:
                result += "L"
                leftHand = i
            elif rightDis == leftDis:
                if hand == "right":
                    result += "R"
                    rightHand = i
                else:
                    result += "L"
                    leftHand = i
    
    return result

abs를 사용하여 음수가 나오지 않도록 만들어줍니다. 

그리고 leftHand와 rightHand의 10과 12는 처음 *과 #을 누르고 있다는 가정이기 때문에 초기값을 지정해주며 

만약 *와 #가 나온다면 해당 숫자로 바꿔주면 됩니다. 

그리고 왼쪽거리와 오른쪽거리가 동일한 경우라면 hand 값에 따라 지정해주면 됩니다. 

결과

[GitHub]

 

GitHub - sg-moomin/algorithmStudy_CodingTest

Contribute to sg-moomin/algorithmStudy_CodingTest development by creating an account on GitHub.

github.com


다음에도 더 알찬 포스팅으로 찾아오겠습니다. 

728x90