[프로그래머스][C++] 키패드 누르기

2024. 5. 27. 01:45·💭 Problem Solving/C++

문제

https://school.programmers.co.kr/learn/courses/30/lessons/67256

 

프로그래머스

코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.

programmers.co.kr

풀이

💡 규칙

  • 1, 4, 7: 왼손 
  • 3, 6, 9: 오른손
  • 2, 5, 8, 0: 거리 계산(더 가까운 쪽)

💡 거리 계산

  1. 키 변환: *: 11 / 0: 12 / #: 13
                                                      1   2   3            1     2     3
                                                      4   5   6    →     4     5     6
                                                      7   8   9             7     8     9
                                                     *    0    #            11   12   13
  2. 한 칸 이동 시 좌우 이동: -1, +1 / 상하 이동: -3, +3 로 계산 가능
    좌우: (눌러야 하는 키 값과 현재 키의 차이) % 3
    상하: (눌러야 하는 키 값과 현재 키의 차이) / 3

    (ex) 2 → 6
           차이: 4 = 우 1칸, 하 1칸 (1 + 3)
  3. 왼손과의 거리 & 오른손과의 거리 비교 후 더 작은 값에 따라 손 결정
    거리가 같을 경우 오른손잡이, 왼손잡이에 따라 결정

코드

#include <iostream>
#include <vector>

using namespace std;

string solution(vector<int> numbers, string hand) {
    string answer = "";
    int l_hand = 10, r_hand = 12;   // 왼손: *, 오른손: # 에서 시작

    for (int key: numbers) {
        if (key == 1 || key == 4 || key == 7) { // 왼손
            l_hand = key;
            answer += 'L';
        } else if (key == 3 || key == 6 || key == 9) {    // 오른손
            r_hand = key;
            answer += 'R';
        } else {  // 거리 계산
            if (key == 0) { // 0은 11로 계산
                key = 11;
            }

            // 상하                   좌우
            int l_distance = abs(key - l_hand) / 3 + abs(key - l_hand) % 3;
            int r_distance = abs(key - r_hand) / 3 + abs(key - r_hand) % 3;

            if (l_distance < r_distance) {    // 왼손이 더 가까움
                l_hand = key;
                answer += 'L';
            } else if (l_distance > r_distance) {   // 오른손이 더 가까움
                r_hand = key;
                answer += 'R';
            } else {  // 왼손, 오른손 거리 같음
                if (hand == "right") {
                    r_hand = key;
                    answer += 'R';
                } else {
                    l_hand = key;
                    answer += 'L';
                }
            }
        }
    }

    return answer;
}

'💭 Problem Solving > C++' 카테고리의 다른 글

[프로그래머스][C++] 타겟 넘버  (0) 2024.05.31
[프로그래머스][C++] 스킬트리  (0) 2024.05.31
[BOJ][C++] 백준 20546번: 🐜 기적의 매매법 🐜  (0) 2024.05.26
[프로그래머스][C++] 체육복  (0) 2024.05.24
[BOJ][C++] 백준 1212번: 8진수 2진수  (0) 2024.05.24
'💭 Problem Solving/C++' 카테고리의 다른 글
  • [프로그래머스][C++] 타겟 넘버
  • [프로그래머스][C++] 스킬트리
  • [BOJ][C++] 백준 20546번: 🐜 기적의 매매법 🐜
  • [프로그래머스][C++] 체육복
0=2.
0=2.
  • 0=2.
    0=2
    0=2.
  • 전체
    오늘
    어제
    • 분류 전체보기 (104)
      • 📂 Project (2)
        • Paint the City (2)
      • 💭 Problem Solving (42)
        • C++ (28)
        • Java (14)
      • 📝 Study (17)
        • React (1)
        • Java (16)
      • 💻 CS (11)
        • 면접을 위한 CS 전공지식 노트 (2)
        • 정보처리기사 (9)
      • 🏃‍♀️ Activities (32)
        • Web Front-End Basic Study (6)
        • 42 Cursus (26)
  • 블로그 메뉴

    • 홈
    • 태그
    • 방명록
    • 글쓰기
  • 링크

  • 공지사항

  • 인기 글

  • 태그

    makefile
    시뮬레이션
    트리
    맵
    swea
    java
    정보처리기사
    구현
    HTML
    git
    그리디 알고리즘
    react
    CSS
    knapsack
    BFS
    CS
    .h
    42경산
    프로그래머스
    C
    unity
    백준
    백트래킹
    dfs
    VR
    La Piscine
    정렬
    dynamic programming
    브루트포스
    github
  • hELLO· Designed By정상우.v4.10.3
0=2.
[프로그래머스][C++] 키패드 누르기
상단으로

티스토리툴바