문제 링크
https://www.acmicpc.net/problem/5622
나의 코드 (java)
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
public class Main {
public static void main (String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
// 입력을 받음
String s = br.readLine();
// 문자열을 아스키로 받기 위한 배열
int arr[] = new int[s.length()];
// 전화를 걸기 위한 최소 시간을 저장할 변수
int sum = 0;
// 문자열을 A:0 부터 Z:25 까지 숫자로 저장
for (int i=0; i<s.length(); i++){
arr[i] = s.charAt(i) - 'A';
}
for (int j=0; j<arr.length; j++) {
if (arr[j] >= 0 && arr[j] < 16) {
// A-P까지 다이얼일 경우 전화를 걸기 위한 시간
sum += arr[j] / 3 + 3;
} else if (arr[j] >= 16 && arr[j] < 23) {
// Q-W까지 다이얼일 경우 전화를 걸기 위한 시간
sum += (arr[j] - 1) / 3 + 3;
} else {
// X-Z까지 다이얼일 경우 전화를 걸기 위한 시간
sum += (arr[j] - 2) / 3 + 3;
}
}
// 결과 출력
System.out.println(sum);
}
}
저는 이 문제를 접근할 때 문자열을 A-Z까지 아스키 코드로 변환 후 'A'를 빼주어 A는 0, Z는 25로 변환하여 저장합니다.
다이얼은 1개의 숫자에 일반적으로 알파벳이 3개지만 4개인 다이얼도 있습니다.
따라서 0~15는 A~P까지, 16~22는 Q~W까지, 23~25는 X~Z까지 범위로 나눌 수 있습니다.
왜냐하면 보통 한 개의 다이얼에 3개의 알파벳이기 때문에 3을 나누어 위치를 찾는 방식을 선택했기 때문입니다.
다이얼 한 개에 4개 알파벳이 있는 경우는 -1을 빼주어 3을 나누어야 합니다.
다이얼에 두 개에 4개의 알파벳이 있는 경우는 -2를 빼주어 3을 나누어야 합니다.
하지만 P는 15이기 때문에 -1을 뺴고 3을 나누게 되면 전화를 걸기 위한 시간이 바뀌게 됩니다. (실제는 8초 → 7초)
W는 22이기 때문에 -2를 빼고 3을 나누게 되면 또 화를 걸기 위한 시간이 바뀌게 됩니다. (실제는 10초 → 9초)
따라서 0~15는 A~P까지, 16~22는 Q~W까지, 23~25는 X~Z까지 범위로 나누게 됩니다.
'코딩공부 > 백준 (java)' 카테고리의 다른 글
[백준 1316] 그룹 단어 체커 (java) (0) | 2021.07.18 |
---|---|
[백준 2941] 크로아티아 알파벳 (java) (0) | 2021.07.17 |
[백준 2908] 상수 (java) (0) | 2021.07.15 |
[백준 1152] 단어의 개수 (java) (0) | 2021.07.15 |
[백준 1157] 단어 공부 (java) (0) | 2021.07.15 |
댓글