문제
전화를 걸고 싶은 번호가 있다면, 숫자를 하나를 누른 다음에 금속 핀이 있는 곳 까지 시계방향으로 돌려야 한다. 숫자를 하나 누르면 다이얼이 처음 위치로 돌아가고, 다음 숫자를 누르려면 다이얼을 처음 위치에서 다시 돌려야 한다.
숫자 1을 걸려면 총 2초가 필요하다. 1보다 큰 수를 거는데 걸리는 시간은 이보다 더 걸리며, 한 칸 옆에 있는 숫자를 걸기 위해선 1초씩 더 걸린다.
상근이의 할머니는 전화 번호를 각 숫자에 해당하는 문자로 외운다. 즉, 어떤 단어를 걸 때, 각 알파벳에 해당하는 숫자를 걸면 된다. 예를 들어, UNUCIC는 868242와 같다.
할머니가 외운 단어가 주어졌을 때, 이 전화를 걸기 위해서 필요한 최소 시간을 구하는 프로그램을 작성하시오.
입력
첫째 줄에 알파벳 대문자로 이루어진 단어가 주어진다. 단어의 길이는 2보다 크거나 같고, 15보다 작거나 같다.
출력
첫째 줄에 다이얼을 걸기 위해서 필요한 최소 시간을 출력한다.
코드
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
String[] str = new String[] {"ABC", "DEF", "GHI", "JKL", "MNO", "PQRS", "TUV", "WXYZ"};
int[] strToInt = new int[str.length];
for(int i=0; i<str.length; i++){
strToInt[i] = i+3;
}
Scanner sc = new Scanner(System.in);
String dial = sc.next();
char[] dialArr = new char[dial.length()];
for(int i=0; i<dialArr.length; i++) {
dialArr[i] = dial.charAt(i);
}
int time = 0;
for(int i=0; i<str.length; i++){
for(int j=0; j<str[i].length(); j++){
for(int k=0; k<dialArr.length; k++){
if(str[i].charAt(j)==dialArr[k]){
time += strToInt[i];
}
}
}
}
System.out.println(time);
}
}
풀이 시도
1. A~Z의 문자열을 먼저 배열로 저장해두고(str) 문제에서 제시한 시간으로 맞춰 int 배열로 만들어야겠다고 생각했다(strToInt).
2. 입력받은 문자열을 char 타입으로 하나씩 잘라 char 배열에 저장했다. (dialArr)
3. dialArr의 문자가 처음 만들어놓은 str 배열 요소의 문자와 일치한다면, 시간을 setting 해놓은 int 배열을 불러와 time에 누적해 대입하도록 했다.
4. 이러고 빨리 풀었다고 좋아했다.............
풀이 개선
1. 쓸데없이 배열로 꼬아서 풀 문제가 아니었다. (ㅠㅠ)
for(int i=0; i<dial.length(); i++){
switch(dial.charAt(i)){
case 'A' : case 'B' : case 'C' :
time += 3;
break;
case 'D' : case 'E' : case 'F' :
time += 4;
break;
.
.
.
}
switch-case로 입력받은 문자열을 char로 나누어 조건이 맞는 case에서 time을 계산해주면 된다.
2. 입력으로 System.in.read()를 사용할 수도 있다.
System.in.read()는 1byte씩 아스키코드로 입력받는다. 예외 없이, A~Z 사이의 문자가 입력된다고 하면 아스키코드로 범위를 지정하고 적절한 time을 반환하게 할 수 있다.
while(true){
value = System.in.read();
if(value == '\n') break; //엔터를 입력받을 때까지 while문을 계속한다
if(value<68) time+=3;
else if(value<71) time+=4;
.
.
}
3. Scanner 대신 BufferedReader를 사용한다.
개그지 같은 코드도 BufferedReader를 사용하는 것만으로도 어느 정도 성능 개선이 된다.
^^..........
지금 배열 메서드 보면서 정리하는 중이라 모든 게 배열으로밖에 안 보였다...................
멍청한 거 반성하고 사고방식 좀 바꾸라고 기록해둔다. 문제에서 요구하는 것을 가장 좋은 방법으로 푸는 연습이 필요하다.
+ 이제 슬슬 밑천 다 떨어져서 자료구조 다시 배우기 전까지는 한동안 개념 정리에 열중해야지 싶다.
ref.
'problem solving > baekjoon' 카테고리의 다른 글
java/ 백준 11286 절댓값 힙 (0) | 2022.07.21 |
---|---|
java/ 백준 2577 숫자의 개수 (0) | 2022.05.09 |
java/ 백준 15552 빠른 A+B (0) | 2022.05.07 |