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

2022. 7. 8. 23:56·정리 전 게시글/공부 관련

문제 : 키패드 누르기


풀이 방법

키패드의 위치를 어떻게 구할까 생각하다가 그냥 각 키패드 번호의 좌표계를 만들어서 두 점사이의 거리 공식을 이용하면 풀 수 있겠다고 생각을 했었습니다.

 

왼쪽 열과 오른쪽 열은 무조건 누르는 손가락이 정해져있지만 가온데 열은 가까운 손가락으로 누르는 조건이 있습니다.

그렇다면 두 점사이의 거리 공식을 이용하면 구하겠지 했는데 막상 만들어 보니 실패라고 뜨더군요.

알고보니 유클리드 거리를 쓰는게 아니라 맨해튼 거리를 쓰는 것이 정답이었습니다.

 

 

우리가 알고 있는 두 점 사이의 공식이 유클리드 거리었고

 

 

이게 맨해튼 거리라고 합니다.

 

문제 조건에 상하좌우로 1칸씩 움직인다고 했기 때문에 맨해튼 거리 공식을 써서 풀어야 했던겁니다.


소스 코드

#include <string>
#include <vector>
#include <cmath>
#include <algorithm>
using namespace std;

string solution(vector<int> numbers, string hand) {
    string answer = "";
    vector<vector<int>> hand_pos = {{0, 3},{2, 3}};
    vector<vector<int>> keypad_pos;
    // 1번부터 0,0 #을 2,3까지 해서 좌표로 넣음
    for(int i=0; i<4; i++) {
        for(int u=0; u<3; u++) {
            vector<int> temp;
            temp.push_back(u);
            temp.push_back(i);
            keypad_pos.push_back(temp);
        }
    }
    
    for(int & i : numbers) {
        if(i==1 || i==4 || i==7) {
            answer.push_back('L');
            hand_pos[0] = keypad_pos[i-1];
        }
        else if(i==3 || i==6 || i==9) {
            answer.push_back('R');
            hand_pos[1] = keypad_pos[i-1];
        }
        // 좌표 계산에 따른 결정
        else if(i==2 || i==5 || i==8 || i==0) {
            int index;
            if(i == 0 ) index = 11;
            else index = i;
            
            double temp[2];
            for(int u=0; u<2; u++) {
                temp[u] = abs(keypad_pos[index-1][0] - hand_pos[u][0]) +
                    abs(keypad_pos[index-1][1] - hand_pos[u][1]);
            }
            if(temp[0] < temp[1]) {
                answer.push_back('L');
                hand_pos[0] = keypad_pos[index-1];
            }
            else if(temp[0] == temp[1]) {
                if(hand == "left") {
                    answer.push_back('L');
                    hand_pos[0] = keypad_pos[index-1];
                }
                else {
                    answer.push_back('R');
                    hand_pos[1] = keypad_pos[index-1];
                }
            }
            else {
                answer.push_back('R');
                hand_pos[1] = keypad_pos[index-1];
            }
        }
    }
    return answer;
}
저작자표시 (새창열림)

'정리 전 게시글 > 공부 관련' 카테고리의 다른 글

[프로그래머스 Level 2, C++] N-Queen  (0) 2022.07.13
[프로그래머스 Level 1, C++] 신고 결과 받기  (0) 2022.07.09
[프로그래머스 Level 1, C++] 크레인 인형뽑기 게임  (0) 2022.07.08
[프로그래머스 Level 1, C++] 실패율  (0) 2022.07.07
[프로그래머스 Level 1, C++] [1차] 다트 게임  (0) 2022.07.06
'정리 전 게시글/공부 관련' 카테고리의 다른 글
  • [프로그래머스 Level 2, C++] N-Queen
  • [프로그래머스 Level 1, C++] 신고 결과 받기
  • [프로그래머스 Level 1, C++] 크레인 인형뽑기 게임
  • [프로그래머스 Level 1, C++] 실패율
aptenia
aptenia
공부하면서 배운 것들
  • aptenia
    새벽의 아이디어
    aptenia
  • 전체
    오늘
    어제
    • 분류 전체보기 (277)
      • f1tenth (2)
      • 개발 관련 아무거나 (1)
      • 정리 전 게시글 (268)
        • 개발 관련 (25)
        • 정보 관련 (19)
        • 공부 관련 (224)
  • 블로그 메뉴

    • 홈
    • 태그
    • 방명록
    • 네이버 블로그
  • 링크

  • 공지사항

  • 인기 글

  • 태그

    C언어강좌
    안드로이드
    프로그래머스
    반복하지않는수
    C언어
    스크롤바CSS
    파이어베이스
    공개SW개발자대회
    빅데이터공모전
    티스토리반응형2스킨편집
    마크
    이것이자바다연습문제
    파이썬
    컨텍스트스위칭
    캡스톤디자인
    티스토리HTML
    자바
    c언어초보
    프로그래머스PCCE
    콜라츠추측
    마인크래프트스크립트
    마크스크립트
    마인크래프트강화스크립트
    이것이자바다
    마인크래프트
    이것이자바다확인문제
    백준
    일본규슈공업대학교
    티스토리스킨편집
    C++강좌
  • 최근 댓글

  • 최근 글

  • hELLO· Designed By정상우.v4.10.3
aptenia
[프로그래머스 Level 1, C++] 키패드 누르기
상단으로

티스토리툴바