백준 20436

hyoJeong·2021년 8월 15일
0

문제링크:https://www.acmicpc.net/problem/20436
문제 난이도: 실버 4
알고리즘: 구현, 문자열, 시뮬레이션, 런타임 전의 전처리
시간제한: 1초

문제해결 idea: 벡터를 만들어 각 알파벳 별로 행과 열의 좌표값을 저장한다.
그리고 현재 왼손 오른손의 위치를 알려주는 문자를 입력받으면 그 값을 기반으로
왼손의 행 열값을 pair 변수에 저장하고 오른손의 위치 또한 동일하게 입력받는다.
왼손은 한글 자음쪽 자판에 해당하는 알파벳을 입력할 수 있고, 오른손은 한글 모음쪽 자판에 해당하는 알파벳을 입력할 수 있는데, q에 해당하는 것을 0행 0열 이라고 기준을 잡고 밑으로 갈수록 행의 값이 커지고, q값 기준 오른쪽으로 갈수록 열의 값이 커진다고 하면, 왼쪽으로 입력할 수 있는 알파벳의 행, 열의 범위는 0행,1행일때는 4열까지, 2행일따는 3열까지 가능하다.
이것을 if 문으로 현재 입력하려는 알파벳이 왼손으로 입력할 수 있는 범위에 포함될 경우, 손가락이 이동하는데 걸리는 시간 + 각 키를 누르는 시간 (=1)을 더해준다.
왼손으로 입력할 수 없는 알파벳은 오른손으로 입력하고 위와 동일하게 알파벳을 누르는데 걸리는 시간을 더해, 정답을 출력하면 된다.
(사진 출처 :https://www.acmicpc.net/problem/20436)

코드

#include <iostream>
#include <algorithm>
#include <vector>
#include <cmath>

using namespace std;

int main(){
    
    cin.tie(0);
    cout.tie(0);
    std::ios::sync_with_stdio(false);
  
    vector<pair<int, int>>v['z'-'a'+1];

    //키보드 판 만들기
    v['q'-'a'].push_back({0,0});
    v['w'-'a'].push_back({0,1});
    v['e'-'a'].push_back({0,2});
    v['r'-'a'].push_back({0,3});
    v['t'-'a'].push_back({0,4});
    v['y'-'a'].push_back({0,5});
    v['u'-'a'].push_back({0,6});
    v['i'-'a'].push_back({0,7});
    v['o'-'a'].push_back({0,8});
    v['p'-'a'].push_back({0,9});
    v['a'-'a'].push_back({1,0});
    v['s'-'a'].push_back({1,1});
    v['d'-'a'].push_back({1,2});
    v['f'-'a'].push_back({1,3});
    v['g'-'a'].push_back({1,4});
    v['h'-'a'].push_back({1,5});
    v['j'-'a'].push_back({1,6});
    v['k'-'a'].push_back({1,7});
    v['l'-'a'].push_back({1,8});
    v['z'-'a'].push_back({2,0});
    v['x'-'a'].push_back({2,1});
    v['c'-'a'].push_back({2,2});
    v['v'-'a'].push_back({2,3});
    v['b'-'a'].push_back({2,4});
    v['n'-'a'].push_back({2,5});
    v['m'-'a'].push_back({2,6});
    
    
    char l,r;
    
    cin>>l>>r;
    string s;
    cin>>s;
    
    int res=0;
    pair<int, int>rh;
    pair<int, int>lh;
    
    lh.first=v[l-'a'].front().first;
    lh.second=v[l-'a'].front().second;
    
    rh.first=v[r-'a'].front().first;
    rh.second=v[r-'a'].front().second;

    int row,col;
    for(int i=0;i<s.size();i++){
        row=v[s[i]-'a'].front().first;
        col=v[s[i]-'a'].front().second;
        //왼손 입력가능 알파벳 범위
        if((0<=row&&row<=1&&col>=0&&col<=4)||(row==2&&col>=0&&col<=3)){
            res+=abs(row-lh.first)+abs(col-lh.second);
            lh.first=row;
            lh.second=col;
            res++;
        }else{
            res+=abs(row-rh.first)+abs(col-rh.second);
            rh.first=row;
            rh.second=col;
            res++;
        }
    }
    
    
        
        cout<<res<<"\n";
    
    
    
    
    
    return 0;
}

0개의 댓글