본문 바로가기

백준

백준 20436 ZOAC 3 (JAVA)

문제

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

 

20436번: ZOAC 3

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

www.acmicpc.net

코드

package com.company;

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

public class Main {

    private static class xy {
        int x;
        int y;

        public xy(int x, int y) {
            this.x = x;
            this.y = y;
        }
    }

    static Map<Character, xy> s = new HashMap<>();
    static Map<Character, xy> v = new HashMap<>();

    public static void main(String[] args) throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        String input = br.readLine();
        xy L, R;
        int time = 0;
        Character c;
        addMap();

        L = s.get(input.charAt(0));
        R = v.get(input.charAt(2));

        input = br.readLine();
        for (int i = 0; i < input.length(); i++) {
            c = input.charAt(i);
            if (s.containsKey(c)) {
                xy dir_L = s.get(c);
                time += Math.abs(L.x - dir_L.x) + Math.abs(L.y - dir_L.y) + 1;
                L = dir_L;
            } else if (v.containsKey(c)) {
                xy dir_R = v.get(c);
                time += Math.abs(R.x - dir_R.x) + Math.abs(R.y - dir_R.y) + 1;
                R = dir_R;
            }
        }

        System.out.println(time);

    }

    private static void addMap() {
        s.put('q', new xy(1, 1));
        s.put('w', new xy(1, 2));
        s.put('e', new xy(1, 3));
        s.put('r', new xy(1, 4));
        s.put('t', new xy(1, 5));
        s.put('a', new xy(2, 1));
        s.put('s', new xy(2, 2));
        s.put('d', new xy(2, 3));
        s.put('f', new xy(2, 4));
        s.put('g', new xy(2, 5));
        s.put('z', new xy(3, 1));
        s.put('x', new xy(3, 2));
        s.put('c', new xy(3, 3));
        s.put('v', new xy(3, 4));

        v.put('y', new xy(1, 6));
        v.put('u', new xy(1, 7));
        v.put('i', new xy(1, 8));
        v.put('o', new xy(1, 9));
        v.put('p', new xy(1, 10));
        v.put('h', new xy(2, 6));
        v.put('j', new xy(2, 7));
        v.put('k', new xy(2, 8));
        v.put('l', new xy(2, 9));
        v.put('b', new xy(3, 5));
        v.put('n', new xy(3, 6));
        v.put('m', new xy(3, 7));
    }

}

풀이

이번 문제는 map을 이용하면 쉽게 풀리는 문제였다. map에는 키값으로 문자가 들어가고 value로는 해당 문자의 위치가 들어간다. 그리고 따로 위치에 맞게 L과 R이라는 변수를 만들어줘서 지금 왼손과 오른손의 위치가 어디에 존재하는지 저장해둔다. 그리고 누르는 시간 계산은 입력값으로 들어오는 문자가 왼손인지 오른손인지 파악하고 그에 따란 위치를 계산하고 해당 키를 입력하는 시간인 +1을 해준다.

'백준' 카테고리의 다른 글

백준 17413 단어 뒤집기2(JAVA)  (0) 2022.07.20
백준 20291 파일 정리(JAVA)  (0) 2022.07.18
백준 10994 별찍기 - 19 (JAVA)  (0) 2022.07.14
백준 12933 오리 (JAVA)  (0) 2022.07.14
백준 1913 달팽이 (JAVA)  (0) 2022.07.11