
내가 생각했을때 문제에서 원하는부분
첫째 줄에 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();
}
}
코드와 설명이 부족할수 있습니다. 코드를 보시고 문제가 있거나 코드 개선이 필요한 부분이 있다면 댓글로 말해주시면 감사한 마음으로 참고해 코드를 수정 하겠습니다.