본문 바로가기
Algorithm

[프로그래머스] 카카오 인턴 - 키패드 누르기

by Jiseong 2021. 9. 6.

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

 

 

[제한사항]

  • numbers 배열의 크기는 1 이상 1,000 이하입니다.
  • numbers 배열 원소의 값은 0 이상 9 이하인 정수입니다.
  • hand는 "left" 또는 "right" 입니다.
    • "left"는 왼손잡이, "right"는 오른손잡이를 의미합니다.
  • 왼손 엄지손가락을 사용한 경우는 L, 오른손 엄지손가락을 사용한 경우는 R을 순서대로 이어붙여 문자열 형태로 return 해주세요.

 

[ 풀이 ]

*은 10, 0은 11, #은 12로 생각했다.

 

세로로 값차이는 3, 가로로 값 차이는 1

 

예를 들어 눌러야 할 숫자가 6, 왼손의 위치가 1, 오른손의 위치가 9 라고 두면

 

8을 누르려면 왼손은 아래로 2번 오른쪽으로 1번, 오른손은 왼쪽으로 1번 움직이면 된다.

 

난 여기서 아래로 2, 오른쪽으로 1 or 왼쪽으로 1 이 숫자들이 필요했다.

 

이게 맞는진 모르겠지만 이렇게 했다.

 

ㅣ 8 (눌러야하는 숫자) -  1 (왼손의 위치)ㅣ = 7

7 / 3 = 2...1 (아래로 2, 오른쪽으로 1)

총 이동 거리: 몫 + 나머지 = 2 + 1 = 3

 

ㅣ 8 (눌러야하는 숫자) -  9 (오른손의 위치)ㅣ = 1

1 / 3 = 0...1 (왼쪽으로 1 )

총 이동 거리: 몫 + 나머지 = 0 + 1 = 1

 

- 거리 비교

3 (왼손 이동거리) > 1 (오른손 이동거리)

오른손이 더 가까우므로 오른손이 움직임 -> result.append("R")

 

- 만일 이동거리가 같을 경우

왼손잡이, 오른손잡이에 따라 결정

1, 4, 7은 왼손 / 3, 6, 9는 오른손

 

//
//  main.swift
//  Programmers_카카오인턴_키패드누르기
//
//  Created by 임지성 on 2021/09/06.
//

import Foundation

func solution(_ numbers:[Int], _ hand:String) -> String {
    enum useHand {
        case left
        case right
    }
    // 1...12 까지 세로로는 3차이 가로로는 1차이
    // 절댓값 (손의 위치 - 가야할 위치) / 3 의 몫과 나머지를 더하면 이동거리
    var result = ""
    var leftHand = 10 // * 왼손 초기 시작 지점 or 왼손 위치
    var rightHand = 12 // # 오른손 초기 시작 지점 or 오른손 위치
    
    for i in numbers {
        let number = i == 0 ? 11 : i
        var touchHand: useHand = .left
        
        switch number {
        case 1, 4, 7:
            touchHand = .left
        case 3, 6, 9:
            touchHand = .right
        case 2, 5, 8, 11:
            let leftDiff = (number - leftHand).magnitude
            let rightDiff = (number - rightHand).magnitude
            
            let leftDistance = (leftDiff / 3) + (leftDiff % 3)
            let rightDistance = (rightDiff / 3) + (rightDiff % 3)
            
            if leftDistance == rightDistance {
                touchHand = hand == "left" ? .left : .right
            } else {
                touchHand = leftDistance < rightDistance ? .left : .right
            }
        default:
            break
        }
        if touchHand == .left {
            result.append("L")
            leftHand = number
        } else {
            result.append("R")
            rightHand = number
        }
    }
    return result
}

댓글