https://www.acmicpc.net/problem/5622
문제
> 상근이의 할머니는 아래 그림과 같이 오래된 다이얼 전화기를 사용한다.
> 전화를 걸고 싶은 번호가 있다면,
숫자를 하나를 누른 다음에 금속 핀이 있는 곳 까지 시계방향으로 돌려야 한다.
> 숫자를 하나 누르면 다이얼이 처음 위치로 돌아가고, 다음 숫자를 누르려면 다이얼을 처음 위치에서 다시 돌려야 한다.
> 숫자 1을 걸려면 총 2초가 필요하다.
> 1보다 큰 수를 거는데 걸리는 시간은 이보다 더 걸리며,
한 칸 옆에 있는 숫자를 걸기 위해선 1초씩 더 걸린다.
> 상근이의 할머니는 전화 번호를 각 숫자에 해당하는 문자로 외운다.
> 즉, 어떤 단어를 걸 때, 각 알파벳에 해당하는 숫자를 걸면 된다.
> 예를 들어, UNUCIC는 868242와 같다.
> 할머니가 외운 단어가 주어졌을 때,
이 전화를 걸기 위해서 필요한 최소 시간을 구하는 프로그램을 작성하시오.
접근
다이얼에 써있는 알파벳 별로 어떤 숫자와 매칭되는지 정의 해준다. 그리고 걸리는 시간은 핀에 닿아야 하므로 2일 땐, 2-> 1-> 빈칸 -> 빈칸 으로 총 3초가 걸리고, 5일 땐, 5->4->3->2->1->빈칸->빈칸으로 총 6초가 걸린다. 즉 매칭되는 숫자 +1초를 해주면 된다는 뜻이다.
문제해결
> 알파벳 별로 매칭되는 숫자의 값을 저장하기 위해 dial 배열을 알파벳의 개수만큼 만든다.
> 다이얼이 2부터 9까지 있으므로 반복해주고 기본적으로 3개 알파벳이라 3번씩 또 j를반복해준다.
> 예외로 7과 9는 4개가 매칭되므로 이를 처리해준다.
> dial에 인덱스로 미리 0으로 선언헀던 변수를 넣어 알파벳을 나타내주고 해당 값으로 i를 넣어 매칭되는 수를 잡아준다.
> 이제 idx를 누적해가며 0 부터 25까지를 저장해준다.
> 저장이 끝나면 단어를 입력받아 한자리 씩 A를 빼서 숫자로 변환해 준 뒤 매칭되는 배열의 값을 누적해 출력해준다.
코드
import java.io.*;
import java.util.*;
import java.lang.*;
public class Main
{
//5622번 다이얼
public static void main(String[] args) throws IOException
{
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
int[] dial = new int[26];
int idx = 0;
for(int i = 2; i <= 9; i++)
{
int n = 3;
if(i == 7 || i == 9) n = 4;
for(int j = 0; j < n; j++)
{
dial[idx] = i;
idx++;
}
}
int sum = 0;
String str = br.readLine();
for(int i = 0; i < str.length(); i++) sum += dial[str.charAt(i) - 'A'] + 1;
System.out.println(sum);
}
}

후기
수와 알파벳 매칭부를 어떻게 해줄까 고민하다 반복문으로 처리했다. 하지만 이보다 if, else if문으로 구간을 나눠주는게 더 좋다고 한다. 각 다이얼마다 끝나는 문자를 기준으로 잡고 해당 문자보다 작거나 같으면 2, 3..연결해준다. 따라서 if(문자 <= 'C') = 2, else if(문자 <= 'F') = 3..이런식이다.
근데 여기서 추가로 각 다이얼을 누르는데 걸리는 시간은 다이얼 숫자 +1이라고 찾아냈었다. 이를 이용해 숫자를 매칭해주는게 아닌 처음부터 문자를 입력받으면서 위 구간나누기 if문으로 C보다 작거나 같으면 3누적, F보다 작거나 같으면 4누적,..이런식으로 해주면 된다. 깨달아 버렸다.