📍 문제 설명
https://www.acmicpc.net/problem/20436
20436번: ZOAC 3
첫 번째 줄에는 두 알파벳 소문자 sL, sR이 주어진다. sL, sR은 각각 왼손 검지손가락, 오른손 검지손가락의 처음 위치이다. 그 다음 줄에는 알파벳 소문자로 구성된 문자열이 주어진다. 문자열의
www.acmicpc.net
💡 접근
꽤나 시간을 많이 쏟은 문제였다...
1.오른쪽/왼쪽으로 나눌 수 있는 부분으로 나누어 맵에 담았는데 오른쪽 부분을 담을 때 처음에 좌표값을 제대로 넣지 못했었다.
2.여러 케이스에 대해서는 통과를 했는데 다른 케이스에서 해당 객체에 대한 값 참조를 제대로 하지 못하는 경우가 있었던 것 같다..?
아래 때문에 에러났던게 아니고 값만 리턴하고 출력은 따로 안해줘서 에러났던거였다.......... 아래 코드는 값 찍어본다고 answer 찍었어서 정답처리 됐던거였다...
변경 전
Point pp = leftMap.get(left);
for(int i = 0; i < s1.length(); i++) {
Point np = leftMap.get(s1.charAt(i));
int dis = Math.abs(np.x - pp.x) + Math.abs(np.y - pp.y);
//pp = np도 하고 새롭게 만들기도 했음
pp = new Point(np.x, np.y);
answer += dis + 1;
}
변경 후
for(int i = 0; i < s1.length(); i++) {
Point pp = leftMap.get(left);
Point np = leftMap.get(s1.charAt(i));
int dis = Math.abs(pp.x - np.x) + Math.abs(pp.y - np.y);
answer += dis + 1;
left = s1.charAt(i);
}
👩💻 코드
import java.io.*;
import java.util.*;
class Point {
public int x;
public int y;
public Point(int x, int y) {
this.x = x;
this.y = y;
}
@Override
public String toString() {
return "Point{" +
"x=" + x +
", y=" + y +
'}';
}
}
public class Main {
static int[] dx = {-1, 1, 0, 0};
static int[] dy = {0, 0, -1, 1};
public int solution(char left, char right, String str) {
int answer = 0;
char[][] keyboard = {
{'q', 'w', 'e', 'r', 't', 'y', 'u', 'i', 'o', 'p'}
, {'a', 's', 'd', 'f', 'g', 'h', 'j', 'k', 'l'}
, {'z', 'x', 'c', 'v', 'b', 'n', 'm'}
};
HashMap<Character, Point> leftMap = new HashMap<>();
HashMap<Character, Point> rightMap = new HashMap<>();
String leftKey = "qwertasdfgzxcv";
String rightKey = "yuiophjklbnm";
for(int i = 0; i < 3; i++) {
for(int j = 0; j < keyboard[i].length; j++) {
if(leftKey.contains(keyboard[i][j] + "")) leftMap.put(keyboard[i][j] , new Point(i,j));
if(rightKey.contains(keyboard[i][j] + "")) rightMap.put(keyboard[i][j], new Point(i, j));
}
}
String s1 = "";
String s2 = "";
//각 손가락 별로 눌러야 하는 키 분리
for(int i = 0; i < str.length(); i++) {
if(leftKey.contains(str.charAt(i) + "")) s1 += str.charAt(i);
if(rightKey.contains(str.charAt(i) + "")) s2 += str.charAt(i);
}
for(int i = 0; i < s1.length(); i++) {
Point pp = leftMap.get(left);
Point np = leftMap.get(s1.charAt(i));
int dis = Math.abs(pp.x - np.x) + Math.abs(pp.y - np.y);
answer += dis + 1;
left = s1.charAt(i);
}
for(int i = 0; i < s2.length(); i++) {
Point pp = rightMap.get(right);
Point np = rightMap.get(s2.charAt(i));
int dis = Math.abs(pp.x - np.x) + Math.abs(pp.y - np.y);
answer += dis + 1;
right = s2.charAt(i);
}
return answer;
}
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
StringTokenizer st = new StringTokenizer(br.readLine());
char left = st.nextToken().charAt(0);
char right = st.nextToken().charAt(0);
String str = br.readLine();
Main s = new Main();
s.solution(left, right, str);
}
}