반응형
문제(출처)
상근이의 할머니는 아래 그림과 같이 오래된 다이얼 전화기를 사용한다.
전화를 걸고 싶은 번호가 있다면, 숫자를 하나를 누른 다음에 금속 핀이 있는 곳 까지 시계방향으로 돌려야 한다.
숫자를 하나 누르면 다이얼이 처음 위치로 돌아가고, 다음 숫자를 누르려면 다이얼을 처음 위치에서 다시 돌려야 한다.
숫자 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; }}
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을 사용하면 이중 반복문으로 할 수 있을것 같습니다.
반응형
'개발(합니다) > 알고리즘&코테' 카테고리의 다른 글
알고리즘 단계별로 풀어보기 : BOJ-2292(벌집) (0) | 2018.12.23 |
---|---|
알고리즘 단계별로 풀어보기 : BOJ-2941(크로아티아알파벳) (0) | 2018.12.22 |
알고리즘 단계별로 풀어보기 : BOJ-2908(상수) (0) | 2018.12.22 |
알고리즘 단계별로 풀어보기 : BOJ-1316(그룹단어체커) (0) | 2018.12.22 |
알고리즘 단계별로 풀어보기 : BOJ-1157(단어공부) (0) | 2018.12.21 |