Algorithm/BOJ

[백준 20435] ZOAC3

giiro 2021. 1. 8. 15:29

문제

www.acmicpc.net/problem/20436

 

20436번: ZOAC 3

첫 번째 줄에는 두 알파벳 소문자 sL, sR이 주어진다. sL, sR은 각각 왼손 검지손가락, 오른손 검지손가락의 처음 위치이다. 그 다음 줄에는 알파벳 소문자로 구성된 문자열이 주어진다. 문자열의

www.acmicpc.net

 

풀이

 

1. 각기 다른 자판의 위치를 좌표로 저장하고 왼쪽 손이 닿을 수 있는 위치, 오른쪽 손이 닿을 수 있는 위치를 구분하여 손의 위치와 자판의 거리만큼 더해가면서 해결할 수 있습니다. 

 

2. 거리와 상관없이 문자를 누르는 횟수는 문자열의 길이와 같습니다. 따라서 답은 거리의 합에 문자열의 길이를 더해준 것입니다.

 

코드

#include <bits/stdc++.h>
using namespace std;
typedef pair<int, int> pii;

int ans, n, x, y;
char l, r;
string s;
map<char, pii> mp;

void init() {
	mp['q'] = { 0,0 }, mp['w'] = { 0,1 }, mp['e'] = { 0,2 }, mp['r'] = { 0,3 }, mp['t'] = { 0,4 },
		mp['y'] = { 0,5 }, mp['u'] = { 0,6 }, mp['i'] = { 0,7 }, mp['o'] = { 0,8 }, mp['p'] = { 0,9 },
		mp['a'] = { 1,0 }, mp['s'] = { 1,1 }, mp['d'] = { 1,2 }, mp['f'] = { 1,3 }, mp['g'] = { 1,4 },
		mp['h'] = { 1,5 }, mp['j'] = { 1,6 }, mp['k'] = { 1,7 }, mp['l'] = { 1,8 }, mp['z'] = { 2,0 },
		mp['x'] = { 2,1 }, mp['c'] = { 2,2 }, mp['v'] = { 2,3 }, mp['b'] = { 2,4 }, mp['n'] = { 2,5 },
		mp['m'] = { 2,6 };
}

int d(char a, char b) {
	return abs(mp[a].first - mp[b].first) + abs(mp[a].second - mp[b].second);
}

int main() {
	cin.tie(NULL); cout.tie(NULL);
	ios_base::sync_with_stdio(false);

	init();
	cin >> l >> r >> s;
	ans = n = s.size();
	for (char c : s) {
		if (c == l || c == r) continue;
		x = mp[c].first, y = mp[c].second;
		if ((!x && y >= 0 && y <= 4) ||
			(x == 1 && y >= 0 && y <= 4) ||
			(x == 2 && y >= 0 && y <= 3)) {
			ans += d(l, c);
			l = c;
		}
		else {
			ans += d(r, c);
			r = c;
		}
	}
	cout << ans;
}