문제링크: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;
}