새벽_나그네
12시 지난 새벽
새벽_나그네
전체 방문자
오늘
어제
  • 분류 전체보기
    • TIL
    • DevLog
    • Algorithm
    • ComputerScience
    • etc

블로그 메뉴

  • 홈
  • 태그
  • 방명록

공지사항

인기 글

태그

  • TodayILearned
  • 내일배움캠프
  • 내일배움단
  • portfolio
  • 코딩
  • 코린이
  • 자기주도학습
  • Python
  • 내일배움카드
  • 프로그래머스
  • til
  • 코딩프로젝트
  • docker
  • 스파르타코딩클럽
  • 개발일지
  • Github
  • 국비지원
  • machine learning
  • Selenium 4
  • AI트랙

최근 댓글

최근 글

티스토리

hELLO · Designed By 정상우.
새벽_나그네

12시 지난 새벽

[프로그래머스] 코딩테스트 연습2020 카카오 인턴십 키패드 누르기
Algorithm

[프로그래머스] 코딩테스트 연습2020 카카오 인턴십 키패드 누르기

2022. 8. 11. 23:37

문제

문제 설명

스마트폰 전화 키패드의 각 칸에 다음과 같이 숫자들이 적혀 있습니다.

이 전화 키패드에서 왼손과 오른손의 엄지손가락만을 이용해서 숫자만을 입력하려고 합니다.
맨 처음 왼손 엄지손가락은 * 키패드에 오른손 엄지손가락은 # 키패드 위치에서 시작하며, 엄지손가락을 사용하는 규칙은 다음과 같습니다.

  1. 엄지손가락은 상하좌우 4가지 방향으로만 이동할 수 있으며 키패드 이동 한 칸은 거리로 1에 해당합니다.
  2. 왼쪽 열의 3개의 숫자 1, 4, 7을 입력할 때는 왼손 엄지손가락을 사용합니다.
  3. 오른쪽 열의 3개의 숫자 3, 6, 9를 입력할 때는 오른손 엄지손가락을 사용합니다.
  4. 가운데 열의 4개의 숫자 2, 5, 8, 0을 입력할 때는 두 엄지손가락의 현재 키패드의 위치에서 더 가까운 엄지손가락을 사용합니다.
    4-1. 만약 두 엄지손가락의 거리가 같다면, 오른손잡이는 오른손 엄지손가락, 왼손잡이는 왼손 엄지손가락을 사용합니다.

순서대로 누를 번호가 담긴 배열 numbers, 왼손잡이인지 오른손잡이인 지를 나타내는 문자열 hand가 매개변수로 주어질 때, 각 번호를 누른 엄지손가락이 왼손인 지 오른손인 지를 나타내는 연속된 문자열 형태로 return 하도록 solution 함수를 완성해주세요.

 

입력 & 출력

입출력 예

numbershandresult

[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"

 

풀이 과정

코드 2번의 방법으로 해결하려고 하다가 실패하여서 다른 풀이를 보고 풀게 되었습니다. 

결과적으로 모든 포지션을 딕셔너리 값으로 저장해놓고 사용하는 간단한 방식으로 풀 수 있는 문제입니다.

1. 키패드를 좌표로 생각하고 dic로 저장한다.

2. 위치에 대한 포지션 값은 left_s, right_s라는 변수에 저장하여 준비한다.

3. 확실히 오른손과 왼손으로 누르는 숫자에 대한 내용은 조건문으로 처리해놓은 후에 누르는 것이 완료되고 나서는 포지션 값을 변경할 수 있게 만들어 놓는다.

4. 중간 값을 누르는 경우에는 절대값을 이용하여 거리를 구해주도록 한다.

5. 거리에 따라서 분기하고 만약 같을 경우에만 right left 값을 확인하여 판별하도록 구성한다.

 

 

코드

코드1

def solution(numbers, hand):
    answer = ''

    # 키패드 좌표료 변경
    dic = {1: [0, 0], 2: [0, 1], 3: [0, 2],
           4: [1, 0], 5: [1, 1], 6: [1, 2],
           7: [2, 0], 8: [2, 1], 9: [2, 2],
           '*': [3, 0], 0: [3, 1], '#': [3, 2]}

    # 시작 위치
    left_s = dic['*']
    right_s = dic['#']

    for i in numbers:
        now = dic[i]
        # 1, 4, 7을 누르는 경우 무조건 왼손
        if i in [1, 4, 7]:
            answer += 'L'
            left_s = now

        # 3, 6, 9를 누르는 경우 무조건 오른손
        elif i in [3, 6, 9]:
            answer += 'R'
            right_s = now

        # 2, 5, 8, 0을 누르는 경우
        else:
            left_d = 0
            right_d = 0

            # 좌표 거리 계산해주기
            for a, b, c in zip(left_s, right_s, now):
                left_d += abs(a - c)
                right_d += abs(b - c)

            # 왼손이 더 가까운 경우
            if left_d < right_d:
                answer += 'L'
                left_s = now

            # 오른손이 더 가까운 경우
            elif left_d > right_d:
                answer += 'R'
                right_s = now

            # 두 거리가 같은 경우
            else:
                # 왼손잡이 경우
                if hand == 'left':
                    answer += 'L'
                    left_s = now

                # 오른손잡이 경우
                else:
                    answer += 'R'
                    right_s = now

    return answer

코드 2

def solution(numbers, hand):
    Ltemp = '*'
    Rtemp = '#'
    L = [1, 4, 7, '*']
    R = [3, 6, 9, '#']
    C = [2, 5, 8, 0]
    answer = ''
    for number in numbers:
        if number == 1 or number == 4 or number == 7:
            answer += "L"
            Ltemp = number
        elif number == 3 or number == 6 or number == 9:
            answer += "R"
            Rtemp = number
        else:
            if Ltemp == 2 or Ltemp == 5 or Ltemp == 8 or Ltemp == 0:
                if Rtemp == 2 or Rtemp == 5 or Rtemp == 8 or Rtemp == 0:
                    if abs(C.index(Rtemp) - C.index(number)) == abs(C.index(Ltemp) - C.index(number)):
                        if hand == "right":
                            answer += "R"
                            Rtemp = number
                        elif hand == "left":
                            answer += "L"
                            Ltemp = number
                elif abs(R.index(Rtemp) - C.index(number)) < abs(C.index(Ltemp) - C.index(number)):
                    answer += "R"
                    Ltemp = number
                else:
                    answer += "L"
                    Rtemp = number

            elif Rtemp == 2 or Rtemp == 5 or Rtemp == 8 or Rtemp == 0:
                if Ltemp == 2 or Ltemp == 5 or Ltemp == 8 or Ltemp == 0:
                    if abs(C.index(Rtemp) - C.index(number)) == abs(C.index(Ltemp) - C.index(number)):
                        if hand == "right":
                            answer += "R"
                            Rtemp = number
                        elif hand == "left":
                            answer += "L"
                            Ltemp = number
                    elif abs(C.index(Rtemp) - C.index(number)) > abs(L.index(Ltemp) - C.index(number)):
                        answer += "L"
                        Ltemp = number
                else:
                    answer += "R"
                    Rtemp = number

            elif abs(R.index(Rtemp) - C.index(number)) == abs(L.index(Ltemp) - C.index(number)):
                if hand == "right":
                    answer += "R"
                    Rtemp = number
                elif hand == "left":
                    answer += "L"
                    Ltemp = number
                elif abs(R.index(Rtemp) - C.index(number)) > abs(L.index(Ltemp) - C.index(number)):
                    answer += "L"
                    Ltemp = number
            else:
                answer += "R"
                Rtemp = number

    return answer
저작자표시 비영리 변경금지 (새창열림)

'Algorithm' 카테고리의 다른 글

[프로그래머스] 나누어 떨어지는 숫자 배열  (0) 2022.08.14
[프로그래머스] 완주하지 못한 선수  (0) 2022.08.12
[프로그래머스] 코딩테스트 연습 연습문제 정수 내림차순으로 배치하기  (0) 2022.08.10
[프로그래머스] 정수 제곱근 판별  (0) 2022.08.09
[프로그래머스] 코딩테스트 연습완전탐색 최소직사각형  (0) 2022.08.08
    'Algorithm' 카테고리의 다른 글
    • [프로그래머스] 나누어 떨어지는 숫자 배열
    • [프로그래머스] 완주하지 못한 선수
    • [프로그래머스] 코딩테스트 연습 연습문제 정수 내림차순으로 배치하기
    • [프로그래머스] 정수 제곱근 판별
    새벽_나그네
    새벽_나그네
    IT, 프로그래밍, 정보, 스마트스토어

    티스토리툴바