Algorithm/baekjoon

ZOAC 3

마닐라 2022. 5. 7. 17:03

📍 문제 설명

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);
    }
}

'Algorithm > baekjoon' 카테고리의 다른 글

순열 정렬  (0) 2022.06.10
홀수 홀릭 호석  (0) 2022.06.04
오리  (0) 2022.05.04
뱀과 사다리 게임  (0) 2022.03.15
빙고  (0) 2022.03.03