본문 바로가기

개발(합니다)/알고리즘&코테

알고리즘 단계별로 풀어보기 : BOJ-5622(다이얼)

반응형

문제(출처)

상근이의 할머니는 아래 그림과 같이 오래된 다이얼 전화기를 사용한다.




전화를 걸고 싶은 번호가 있다면, 숫자를 하나를 누른 다음에 금속 핀이 있는 곳 까지 시계방향으로 돌려야 한다. 

숫자를 하나 누르면 다이얼이 처음 위치로 돌아가고, 다음 숫자를 누르려면 다이얼을 처음 위치에서 다시 돌려야 한다.


숫자 1을 걸려면 총 2초가 필요하다. 

1보다 큰 수를 거는데 걸리는 시간은 이보다 더 걸리며, 한 칸 옆에 있는 숫자를 걸기 위해선 1초씩 더 걸린다.


상근이의 할머니는 전화 번호를 각 숫자에 해당하는 문자로 외운다. 

즉, 어떤 단어를 걸 때, 각 알파벳에 해당하는 숫자를 걸면 된다. 

예를 들어, UNUCIC는 868242와 같다.


할머니가 외운 단어가 주어졌을 때, 이 전화를 걸기 위해서 필요한 시간을 구하는 프로그램을 작성하시오.


입력

첫째 줄에 알파벳 대문자로 이루어진 단어가 주어진다. 단어는 2글자~15글자로 이루어져 있다.


출력

첫째 줄에 다이얼을 걸기 위해서 필요한 시간을 출력한다.


예제 입력

UNUCIC


예제 출력

36



내 풀이

import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;

public class Main {
    public static void main(String args[]) {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));
//      System.out.println((int) 'A'); // 65
//      System.out.println((int) 'Z'); // 90

        try {
            String str = br.readLine();

            String[] alphbet = initAlphabet();
//          다이얼의 알파벳을 초기화합니다.
            int[] num = new int[str.length()];
//          다이얼의 숫자를 저장 할 배열 변수를 선언합니다.
            for (int k = 0; k < str.length(); k++) {
//              입력 받은 문자열 길이만큼 반복합니다.
                for (int i = 0; i < alphbet.length; i++) {
//                  0부터 9까지 반복합니다.
                    for (int j = 0; j < alphbet[i].length(); j++) {
//                      다이얼의 알파벳만큼 반복하고 입력 받은 값과 비교합니다.
                        if (alphbet[i].charAt(j) == str.charAt(k)) {
                            num[k] = i;
//                          알파벳 인덱스 위치에 0-9까지 인덱스 값을 저장합니다.
                        }
                    }
                }
            }
            int sum = 0;
            for (int i : num) {
                sum += (i + 1) + 1;
//              첫번째 1은 0부터 시작하는 값을 보정합니다.
//              두번째 1은 1초를 더해 보정합니다.
            }

            bw.write(String.valueOf(sum));
            bw.flush();
            bw.close();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

    private static String[] initAlphabet() {
        String[] alphbet = new String[10];
        alphbet[0] = "";
        alphbet[1] = "ABC";
        alphbet[2] = "DEF";
        alphbet[3] = "GHI";
        alphbet[4] = "JKL";
        alphbet[5] = "MNO";
        alphbet[6] = "PQRS";
        alphbet[7] = "TUV";
        alphbet[8] = "WXYZ";
        alphbet[9] = "option";

        return alphbet;
    }
}



내 풀이 해석

다이얼 알파벳을 배열로 저장합니다.
다이얼 알파벳을 순회하면서 입력 받은 값과 같은지 확인합니다.
같다면 해당 입력 값의 인덱스에 알파벳 인덱스를 저장합니다.
인덱스가 0부터 시작하니 1을 보정합니다.
1초가 더 걸리니 1을 보정합니다.

아쉬운 점

삼중 반복문 말고 각 다이얼마다 delimiter을 사용하면 이중 반복문으로 할 수 있을것 같습니다.


반응형