μ•Œκ³ λ¦¬μ¦˜/λ°±μ€€

[ λ°±μ€€ / BOJ 20436 ] ZOAC 3 ( JAVA / μžλ°” )

KIMHYEYUN 2022. 2. 15. 17:28
λ°˜μ‘ν˜•

https://www.acmicpc.net/problem/20436

 

20436번: ZOAC 3

첫 번째 μ€„μ—λŠ” 두 μ•ŒνŒŒλ²³ μ†Œλ¬Έμž sL, sR이 μ£Όμ–΄μ§„λ‹€. sL, sR은 각각 왼손 검지손가락, 였λ₯Έμ† κ²€μ§€μ†κ°€λ½μ˜ 처음 μœ„μΉ˜μ΄λ‹€. κ·Έ λ‹€μŒ μ€„μ—λŠ” μ•ŒνŒŒλ²³ μ†Œλ¬Έμžλ‘œ κ΅¬μ„±λœ λ¬Έμžμ—΄μ΄ μ£Όμ–΄μ§„λ‹€. λ¬Έμžμ—΄μ˜

www.acmicpc.net

문제 μ„€λͺ…

μ„±μš°λŠ” λ…μˆ˜λ¦¬ 타법

  • λ…μˆ˜λ¦¬ νƒ€λ²•μ΄λž€ μ–‘ μ†μ˜ κ²€μ§€ μ†κ°€λ½λ§Œ μ΄μš©ν•΄ νƒ€μžλ₯Ό μΉ˜λŠ” 타법
  • ν•œκΈ€ 자음 μͺ½ 자판 πŸ‘‰ 왼손, ν•œκΈ€ λͺ¨μŒ μͺ½ 자판 πŸ‘‰ 였λ₯Έμ†
  • a의 μ’Œν‘œ $(x_1,y_1)$, b의 μ’Œν‘œκ°€ $(x_2,y_2)$일 λ•Œ, aμ—μ„œ b둜 μ΄λ™ν•˜λŠ”λ° κ±Έλ¦¬λŠ” μ‹œκ°„μ€ $|x_1-x_2|+|y_1-y_2|$
  • 각 ν‚€λ₯Ό λˆ„λ₯΄λŠ” λ°μ—λŠ” 1의 μ‹œκ°„
  • 두 손을 λ™μ‹œμ— 움직일 수 μ—†μŒ
  • ν‚€λ³΄λ“œ

λ¬Έμžμ—΄μ„ μΉ˜λŠ”λ° κ±Έλ¦¬λŠ” μ‹œκ°„μ˜ μ΅œμ†Ÿκ°’

문제 풀이

1. makeKeyboard()

Map<String, int[]> 두 κ°œμ— 각각 자판의 κ°’κ³Ό μ’Œν‘œλ₯Ό μ €μž₯ν•œλ‹€.
ν•˜λ‚˜λŠ” conKey → 왼손이 μΉ˜λŠ” 자판
λ‹€λ₯Έ ν•˜λ‚˜λŠ” vowelKey → 였λ₯Έμ†μ΄ μΉ˜λŠ” 자판
이닀.

2. CalTime(startLeft, startRight, str)

μ‹œκ°„μ„ 계산 !!

str의 λ¬Έμžλ“€μ΄ ν¬ν•¨λ˜μ–΄μžˆλŠ” μœ„μΉ˜μ— 따라 κ³„μ‚°ν•˜λ©΄λœλ‹€.
λ§Œμ•½ conKey에 ν¬ν•¨λ˜μ–΄μžˆλ‹€λ©΄, startLeft의 κ°’μ—μ„œ μ΄λ™ν•˜λŠ” μ‹œκ°„μ„ 더해주고, λˆ„λ₯΄λŠ” μ‹œκ°„ += 1 ν•΄μ€€λ‹€.
ν¬ν•¨λ˜μ–΄μžˆμ§€ μ•Šλ‹€λ©΄, startRight κ°’μœΌλ‘œ 계산해주면 됨

~

μ½”λ“œ

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.HashMap;
import java.util.Map;
import java.util.StringTokenizer;

public class Main_BOJ_20436_ZOAC_3 {
    static Map<String, int[]> conKey, vowelKey;
    public static void main(String[] args) throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        StringTokenizer stringTokenizer = new StringTokenizer(br.readLine());

        conKey = new HashMap<>();
        vowelKey = new HashMap<>();
        makeKeyBoard();

        String startLeft = stringTokenizer.nextToken();
        String startRight = stringTokenizer.nextToken();
        String str = br.readLine();

        int ans = calTime(startLeft, startRight, str);

        System.out.println(ans);
    }

    private static int calTime(String startLeft, String startRight, String str) {
        int time = 0;
        for (char c : str.toCharArray()) {
            int[] s, d;
            if (conKey.containsKey(c + "")) {
                s = conKey.get(startLeft);
                d = conKey.get(c + "");
                startLeft = c + "";
            } else {
                s = vowelKey.get(startRight);
                d = vowelKey.get(c + "");
                startRight = c + "";
            }

            time += Math.abs(s[0] - d[0]) + Math.abs(s[1] - d[1]);
            time += 1;
        }
        return time;
    }

    private static void makeKeyBoard() {
        conKey.put("q", new int[]{0, 0});
        conKey.put("w", new int[]{0, 1});
        conKey.put("e", new int[]{0, 2});
        conKey.put("r", new int[]{0, 3});
        conKey.put("t", new int[]{0, 4});
        vowelKey.put("y", new int[]{0, 5});
        vowelKey.put("u", new int[]{0, 6});
        vowelKey.put("i", new int[]{0, 7});
        vowelKey.put("o", new int[]{0, 8});
        vowelKey.put("p", new int[]{0, 9});

        conKey.put("a", new int[]{1, 0});
        conKey.put("s", new int[]{1, 1});
        conKey.put("d", new int[]{1, 2});
        conKey.put("f", new int[]{1, 3});
        conKey.put("g", new int[]{1, 4});
        vowelKey.put("h", new int[]{1, 5});
        vowelKey.put("j", new int[]{1, 6});
        vowelKey.put("k", new int[]{1, 7});
        vowelKey.put("l", new int[]{1, 8});

        conKey.put("z", new int[]{2, 0});
        conKey.put("x", new int[]{2, 1});
        conKey.put("c", new int[]{2, 2});
        conKey.put("v", new int[]{2, 3});
        vowelKey.put("b", new int[]{2, 4});
        vowelKey.put("n", new int[]{2, 5});
        vowelKey.put("m", new int[]{2, 6});
    }
}
728x90
λ°˜μ‘ν˜•