백준 문자메시지

KIMYEONGJUN·2024년 10월 16일
post-thumbnail

문제

내가 생각했을때 문제에서 원하는부분

첫째 줄에 p와 w가 주어진다.
(1 ≤ p, w ≤ 1,000) p는 버튼을 한번 누르는데 걸리는 시간이고,
w는 AC와 같은, 같은 숫자인 문자를 연속으로 찍기 위해 기다리는 시간을 의미한다.
그리고 둘째 줄에는 적을 문자열이 주어진다.
단, 이 문자열의 길이는 1000보다 작고,
맨 앞과 맨 뒤에 공백이 들어오는 경우는 없다.
문자열은 알파벳 대문자와 띄어쓰기만으로 이루어져 있다.
첫째 줄에 메시지를 적는데 걸리는 시간을 출력한다.

내가 이 문제를 보고 생각해본 부분

핸드폰 자판: 각 숫자 버튼에는 여러 글자가 할당되어 있다.
시간 계산: 각 버튼을 누를 때 걸리는 시간(p)과 같은 버튼을 연속으로 누를 때 기다려야 하는 시간(w)을 고려해야 한다.
입력 문자열: 입력 문자열을 처리하여 필요한 총 시간을 계산한다.
키 매핑: 각 문자가 어떤 키에 해당하는지, 그리고 몇 번 눌러야 하는지를 배열로 정의한다.
number[]: 각 문자가 어떤 버튼에 있는지를 저장.
order[]: 각 문자를 입력하기 위해 몇 번 눌러야 하는지를 저장.
BufferedReader를 사용하여 입력을 효율적으로 처리합니다. 첫 번째 줄에서 p와 w를 읽고, 두 번째 줄에서 입력할 문자열을 읽는다.
반복문을 사용하여 문자열의 각 문자에 대해 처리해준다.
공백인 경우, 버튼을 눌러야 하므로 p를 결과에 추가한다.
각 문자의 번호와 눌러야 할 횟수를 기반으로 시간을 계산하여 result에 추가한다.
이전 문자와 현재 문자가 같은 키에 속하는 경우, 대기 시간 w를 추가한다.

코드로 구현

package baekjoon.baekjoon_23;

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

// 백준 2037번 문제
public class Main808 {

    // 문자 순서대로 몇 번 자판에 있는지
    static int[] number = {2, 2, 2, 3, 3, 3, 4, 4, 4, 5, 5, 5, 6, 6, 6, 7, 7, 7, 7, 8, 8, 8, 9, 9, 9, 9};
    // 문자 순서대로 해당 자판을 몇 번 눌러야 하는지
    static int[] order = {1, 2, 3, 1, 2, 3, 1, 2, 3, 1, 2, 3, 1, 2, 3, 1, 2, 3, 4, 1, 2, 3, 1, 2, 3, 4};

    public static void main(String[] args) throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        StringTokenizer st = new StringTokenizer(br.readLine());

        int p = Integer.parseInt(st.nextToken());
        int w = Integer.parseInt(st.nextToken());

        char[] strArr = br.readLine().toCharArray();

        int result = 0;
        for (int i = 0; i < strArr.length; i++) {

            // 공백인 경우
            if (strArr[i] == ' ') {
                result += p;
                continue;
            }

            // 해당 문자를 입력하기 위해서 자판을 누를 횟수만큼 걸리는 시간
            result += p * order[strArr[i] - 'A'];
            // 만약 앞 문자가 현재 문자와 같은 자판에 있는 문자라면, w 시간만큼 기다려야 함
            if (i > 0 && strArr[i - 1] != ' ' &&
                    number[strArr[i - 1] - 'A'] == number[strArr[i] - 'A']) {
                result += w;
            }
        }

        System.out.println(result);
        br.close();
    }
}

마무리

코드와 설명이 부족할수 있습니다. 코드를 보시고 문제가 있거나 코드 개선이 필요한 부분이 있다면 댓글로 말해주시면 감사한 마음으로 참고해 코드를 수정 하겠습니다.

profile
Junior backend developer

0개의 댓글