https://www.acmicpc.net/problem/20436
import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.util.HashMap;
import java.util.Map;
import java.util.StringTokenizer;
public class Main_20436 {
static Map<Character, Pos> lefts, rights;
static int totalTime = 0, distance;
static Pos sL, sR;
public static void main(String[] args) throws Exception {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
StringTokenizer st = new StringTokenizer(br.readLine());
//키보드 초기 조건 세팅
setKeyboard();
//왼쪽, 오른쪽 시작 위치
char l = st.nextToken().charAt(0);
char r = st.nextToken().charAt(0);
sL = lefts.containsKey(l) ? lefts.get(l) : rights.get(l);
sR = rights.containsKey(r) ? rights.get(r) : lefts.get(r);
String input = br.readLine(); //출력 문자열
for (int i = 0; i < input.length(); i++) {
Character c = input.charAt(i);
if (lefts.containsKey(c)) { //왼쪽 자판인 경우
Pos now = lefts.get(c);
distance = Math.abs(sL.x - now.x) + Math.abs(sL.y - now.y);
sL = now;
} else { //왼쪽의 경우
Pos now = rights.get(c);
distance = Math.abs(sR.x - now.x) + Math.abs(sR.y - now.y);
sR = now;
}
totalTime += (distance + 1); //누르는 시간 포함
}
System.out.println(totalTime);
}
private static void setKeyboard() {
char[][] leftAlpha = {{'q', 'w', 'e', 'r', 't'}, {'a', 's', 'd', 'f', 'g'}, {'z', 'x', 'c', 'v'}};
char[][] rightAlpha = {{'y', 'u', 'i', 'o', 'p'}, {'h', 'j', 'k', 'l'}, {'b', 'n', 'm'}};
lefts = new HashMap<>();
for (int i = 0; i < 3; i++) {
for (int j = 0; j < 5; j++) {
lefts.put(leftAlpha[i][j], new Pos(i, j));
if(i == 2 && j == 3)
break;
}
}
rights = new HashMap<>();
for (int i = 0; i < 3; i++) {
for (int j = 0; j < 5 - i; j++) {
int y = i == 2 ? 4 + j : 5 + j;
rights.put(rightAlpha[i][j], new Pos(i, y));
}
}
}
private static class Pos{
int x, y;
Pos(int x, int y) {
this.x = x;
this.y = y;
}
}
}
💡 구현, 시뮬레이션
풀이
키보드의 생김새는 위와 같다. 왼쪽 손과 오른쪽 손이 활동하는 영역이 각각 한정되어 있기에 처음에는 아예 left, right부분을 나눠서 구성했다.
입력할 character가 있는 곳의 좌표(위치)가 필요함 >> 해시맵(Map<Character, Pos>)으로 lefts, rights 부분을 나눠서 정의해줌으로써 Character(입력 알파벳) 정보만 가지고도 (1) 움직일 손 (왼/오) , (2) 해당 알파벳이 있는 위치(Pos)를 구할 수 있게 했다.하지만 이때 주의해야 될 점이 하나 있다.
💡 처음 입력으로 주어지는 S_L, S_R은 손 방향에 상관없이 무작위로 주어진다!!
-> 즉, 처음부터 왼/오 좌표 공간을 분리해 둘 다 0부터 좌표가 시작하면 계산이 어려워진다
-> Map을 분리해 저장하되, right 부분의 좌표는 0이 아닌 5(또는 4)부터 시작... 즉 위 키보드 좌표 그대로 저장함
진행 과정
- 왼손/오른손 활동 영역 정보 (알파벳, 위치) 정보가 담긴 해시맵 각각 생성 (이때 오른손은 y가 5 ~ 9, 5 ~ 8, 4 ~ 6 사이)
- 왼손 시작 위치, 오른손 시작위치 입력받아 S_L, S_R에 저장
- 출력해야하는 문자열, 문자 하나씩 읽으며 왼쪽/오른쪽인지 파악
-> 택시거리 (기존 위치 - 신규 위치) 계산 + 1(누르는 시간)
-> 해당 손 위치 갱신
'Algorithm > Beakjoon' 카테고리의 다른 글
[JAVA] 백준 14567번 : 선수과목 (Prerequisite) (0) | 2024.05.12 |
---|---|
[JAVA] 백준 3649번 : 로봇 프로젝트 (0) | 2024.05.12 |
[JAVA] 백준 14499번 : 주사위 굴리기 (2) | 2024.05.01 |
[JAVA] 백준 12100번 : 2048(Easy) (0) | 2024.04.30 |
[JAVA] 백준 11404번 : 플로이드 (1) | 2024.04.25 |