Python/알고리즘 문제 풀이

[코테] [카카오 인턴] 키패드 누르기

마이구미+ 2023. 5. 30. 11:44

<로직 고민>

  • 음 일단 이런 건 replace를 쓰라고 배웠지...!
  • 왼손 쓸 때 숫자랑 오른손 쓸 때 숫자를 묶어야겠군 근데 리스트가 좋을지 딕셔너리가 좋을지 모르겠다
  • 손은 하나 숫자는 여러 개니까 리스트가 나을 듯..??
  • 리스트에는 replace를 못 쓰는구나..ㅎ
def solution(numbers, hand):
    answer = ""
    left = [1, 4, 7]
    right = [3, 6, 9]
    for l in range(3):
        numbers = str(numbers).replace(str(left[l]), "L")
        numbers = str(numbers).replace(str(right[l]), "R")
    print(numbers)
    return


print(solution([1, 3, 4, 5, 8, 2, 1, 4, 5, 9, 5], "right"))
print(solution([7, 0, 8, 2, 8, 3, 1, 5, 7, 6, 2], "left"))
print(solution([1, 2, 3, 4, 5, 6, 7, 8, 9, 0], "right"))
  • 근데 이러면 2,5,8,0을 어떻게 할 수가 없을 거 같다
  • 이전 값과 비교를 해야 하는데 그냥 해당하는 거 다 바꾸니까....흠...
  • 원래의 numbers를 먼저 돌려서 2,5,8,0부터 해치우고 L,R을 붙이는 게 좋을 듯?
  • 음..모르겠다....후 결국 힌트 봤다
  • 아 이거 좌표 문제네....좌표.....

<완성된 코드>

def solution(numbers, hand):
    answer = ''
    keypad = {1:(0,0), 2:(1,0), 3:(2,0),
              4:(0,1), 5:(1,1), 6:(2,1),
              7:(0,2), 8:(1,2), 9:(2,2),
                       0:(1,3)}
    left, right = (0,3), (2,3)
        
    for number in numbers:
        # 왼쪽 키패드
        if number in [1,4,7]:
            answer += "L"
            left = keypad[number]
            
        # 오른쪽 키패드
        elif number in [3,6,9]:
            answer += "R"
            right = keypad[number]
            
        # 가운데 키패드
        else:
            # 현재 손가락 위치와 키패드 간의 거리 계산
            left_distance = abs(keypad[number][0]-left[0]) + abs(keypad[number][1]-left[1])
            right_distance = abs(keypad[number][0]-right[0]) + abs(keypad[number][1]-right[1])
            
            # 왼쪽이 더 가까울 때
            if left_distance < right_distance:
                answer += "L"
                left = keypad[number]
                
            # 오른쪽이 더 가까울 때
            elif left_distance > right_distance:
                answer += "R"
                right = keypad[number]
                
            # 거리가 똑같을 때
            else:
                if hand == "left":
                    answer += "L"
                    left = keypad[number]
                else:
                    answer += "R"
                    right = keypad[number]                    
    return answer


print(solution([1, 3, 4, 5, 8, 2, 1, 4, 5, 9, 5], "right")) # LRLLLRLLRRL
print(solution([7, 0, 8, 2, 8, 3, 1, 5, 7, 6, 2], "left"))  # LRLLRRLLLRR
print(solution([1, 2, 3, 4, 5, 6, 7, 8, 9, 0], "right"))    # LLRLLRLLRL

<느낀 점>

  • 이번에는 다른 사람 풀이는 안 가져왔다
  • 다 내 풀이와 로직이 비슷한 거 같다
  • 나도 구글링을 찾아서 온전히 내 코드라고 할 수는 없지만
  • 그래도..!!! 보고 따라 쓴 게 아니라 힌트 보고 이해해서 쭉 써나간 거니까 ...한 28% 정도는 내 코드라고 할 수 있지 않을까?
  • 여튼 이 문제로 이제 좌표 문제는 잘 풀 수 있을 거 같기도 하고....
  • 아니 또 다른 문제를 만나면 난 또 응용하길 어려워 하겠지...휴
  • 2시간만에 푼 거 실화인가..?