[알고리즘] Swift -프로그래머스 연습문제 #67256(2020 카카오 인턴십_키피드 누르기)

2023. 4. 22. 00:55ALGORITHM/Swift

728x90
반응형

문제링크

 

 

 

 

분석

스마트폰 키패드에는 숫자들이 적혀있다.

왼손과 오른손 엄지손가락을 이용하여 숫자를 입력하려고 한다.

맨 처음 왼손 엄지손가락은 * 키패드, 오른손 엄지손가락은 # 키패드 위치에서 시작한다.

  1. 엄지손가락은 상하좌우 4가지 방향으로 이동할 수 있다. 키패드 한 칸 이동은 거리 1이다
  2. 왼쪽 3개의 숫자 1,4,7 은 왼손 엄지손가락을 사용한다.
  3. 오른쪽 3개의 숫자 3,6,9 는 오른손 엄지손가락을 사용한다.
  4. 가운데 열의 4개의 숫자 2,5,8,0 은 두 엄지손가락 중 가까운 엄지손가락을 사용한다.
    1. 두 엄지손가락의 거리가 같다면 오른손잡이는 오른손을, 왼손잡이는 왼손을 사용한다.

순서대로 누를 번호 배열과 왼손잡이인지 오른손잡이인지가 주어질 때 각 번호를 누를 손가락이 왼손인지 오른손인지를 나타내는 문자열을 리턴하는 문제

 

풀이 과정

왼쪽 3개와 오른쪽 3개의 숫자는 정해져있으므로 그대로 문자열을 추가해주고

가운데 열에 있는 4개의 숫자를 왼손으로 누를 지 오른손으로 누를 지를 정해주면 된다.

일단 숫자배열로 되어있기때문에 거리를 구하는 것은 현재 왼손이나 오른손의 위치에서 눌러야할 위치의 숫자를 빼주어 거리를 계산하면 된다.

단순히 숫자를 빼주면 수의 거리가 나오는 데 거기서 3으로 나누어서 몫과 나머지를 더해주게 되면 거리가 나온다.

몫은 행에 대한 거리이고 나머지는 열에 대한 거리이다.

예를 들어

다음 눌러야할 숫자 = 2, 왼손의 위치 = 7, 오른손의 위치 = 3일때

왼손 = (7-2 / 3) + (7-2 % 3) = 1+2 = 3

오른손 = (3-2 /3) + (3-2 %3) = 0+1 = 1

따라서 이럴 경우 오른손으로 누르게 된다.

 

 

풀이

import Foundation

func solution(_ numbers:[Int], _ hand:String) -> String {
    var result = ""
    var left: Int = 10
    var right: Int = 12
    var numberArr = numbers

    for i in 0..<numberArr.count {
        if numberArr[i] == 0 {
            numberArr[i] = 11
        }
        switch numberArr[i] {
        case 1,4,7:
            left = numberArr[i]
            result += "L"

        case 3,6,9:
            right = numberArr[i]
            result += "R"

        default:
        //왼손거리와 오른손거리 구하기
            var leftDistance = (abs(numberArr[i]-left) / 3) + (abs(numberArr[i]-left) % 3)
            var rightDistance = (abs(numberArr[i]-right) / 3) + (abs(numberArr[i]-right) % 3)
            if leftDistance > rightDistance {
                right = numberArr[i]
                result += "R"
            } else if leftDistance < rightDistance {
                left = numberArr[i]
                result += "L"
                
            } else {
            	//왼손과 오른손거리가 같을 경우
                if hand == "right" {
                    right = numberArr[i]
                    result += "R"
                } else {
                    left = numberArr[i]
                    result += "L"
                }
            }
        }
    }

    return result
}

 

결과

print(solution([1, 3, 4, 5, 8, 2, 1, 4, 5, 9, 5]    , "right"    ))

 

 

 


📂  정리

숫자에 대한 규칙을 빨리 캐치하고 거리를 구하는 것만 알아내면 빠르게 풀 수 있는 문제

제일 마지막 행인 * 0 #의 초기값을 설정해주는 것이 중요하다.

꼭 모든 예제를 실행하고 출력결과를 확인해야겠다.

 

 

 

 

 

 

728x90
반응형