백준 브론즈II - 5622 다이얼
백준 브론즈II - 5622 다이얼 문제 풀이
문제 설명
상근이의 할머니는 아래 그림과 같이 오래된 다이얼 전화기를 사용한다.
전화를 걸고 싶은 번호가 있다면, 숫자를 하나를 누른 다음에 금속 핀이 있는 곳 까지 시계방향으로 돌려야 한다. 숫자를 하나 누르면 다이얼이 처음 위치로 돌아가고, 다음 숫자를 누르려면 다이얼을 처음 위치에서 다시 돌려야 한다.
숫자 1을 걸려면 총 2초가 필요하다. 1보다 큰 수를 거는데 걸리는 시간은 이보다 더 걸리며, 한 칸 옆에 있는 숫자를 걸기 위해선 1초씩 더 걸린다.
상근이의 할머니는 전화 번호를 각 숫자에 해당하는 문자로 외운다. 즉, 어떤 단어를 걸 때, 각 알파벳에 해당하는 숫자를 걸면 된다. 예를 들어, UNUCIC는 868242와 같다.
할머니가 외운 단어가 주어졌을 때, 이 전화를 걸기 위해서 필요한 최소 시간을 구하는 프로그램을 작성하시오.
문제의 자세한 내용은 해당 링크를 통해 확인 : 문제 링크
풀이 코드
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
public class Main {
static final int baseTime = 2; // 최소 걸리는 시간
static final int baseAddTime = 1; // 추가되는 시간
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); // 입력을 받기 위한 BufferedReader 인스턴스 생성
String inputStr = br.readLine(); // 입력된 문자열을 저장하는 변수
int resultNum = 0; // 걸리는 시간을 저장하는 변수
for(char c : inputStr.toCharArray()) // 입력받은 문자열을 char[]으로 변환 후 향상된 for문 사용
resultNum += charToNum(c); // 현재까지 걸린 시간 + 입력받은 숫자를 돌리는데 걸리는 시간
System.out.println(resultNum); // 최종적으로 걸린 시간 출력
}
public static int charToNum(char c) { // 입력받은 문자열에 매칭되는 번호를 거는데 걸리는 시간을 반환하는 메서드
switch(c) {
case 'A': case 'B': case 'C': return baseTime + baseAddTime;
case 'D': case 'E': case 'F': return baseTime + (baseAddTime * 2);
case 'G': case 'H': case 'I': return baseTime + (baseAddTime * 3);
case 'J': case 'K': case 'L': return baseTime + (baseAddTime * 4);
case 'M': case 'N': case 'O': return baseTime + (baseAddTime * 5);
case 'P': case 'Q': case 'R': case 'S': return baseTime + (baseAddTime * 6);
case 'T': case 'U': case 'V': return baseTime + (baseAddTime * 7);
case 'W': case 'X': case 'Y': case 'Z': return baseTime + (baseAddTime * 8);
default : return baseTime;
}
}
문제 해결 전략
이라 쓰고 문제를 보고서 어떻게 풀면 될까?에 대한 생각을 정리한 항목
문제를 보고서 switch문을 사용하는 방법과 map을 사용하는 방법이 떠올랐지만 map을 만들어서 사용할 때 데이터 입력 부분을 구현하는 게 귀찮아서 switch문을 사용하는 방법을 선택
다이얼 그림에서 1번에 매칭되는 문자가 없고, 0번의 경우에는 "OPERATOR"라는 문자열이 적혀있어 해당 문제에선 생각할 필요 없다고 가정하고 진입
문제를 잘 못 이해하여 이해하는 데까지 오랜 시간이 소요, 숫자 1을 걸때 2초가 필요하다는 내용을 보고서 핀까지 1초 돌아오는데 1초로 생각하고 숫자 2를 걸 땐 핀까지 2초, 돌아오는데 2초로 생각하다가 입출력 예시를 보고서 아님을 판단
이후 입출력 예시를 기준으로 시간을 직접 계산해 보며 핀까지 걸리는 시간은 1초씩 늘어나는 게 맞지만, 돌아오는데 걸리는 시간은 항상 1초로 고정되어 있다고 판단
이후 문제를 풀고 난 다음 포스팅 중 이것도 문제를 잘 못 이해하고 풀었음을 깨달음
숫자 1을 거는데 총 2초 소요, 1보다 큰 수를 거는데 걸리는 시간은 한 칸 옆으로 이동할 때마다 1초 증가 => 즉 되돌아오는 시간을 고민할 게 아니라 그냥 2는 3초, 3은 4초, 5는 5초, ..., 9는 10초가 소요된다고 생각하고 계산하면 끝나는 문제였다는 사실을 깨달음
결론은 문제 이해를 잘 못하는 바람에 난항을 겪은 케이스
아무튼 문제를 풀 땐 입력받은 문자열을 문자로 나누어서 해당 문자에 매칭되는 숫자를 거는데 걸리는 시간을 반환받아 다 더하면 끝나는 문제임을 파악
따라서 문자(char)를 매개변수로 받아 매칭되는 숫자를 거는데 걸리는 시간을 반환하는 메서드를 사용하고자 charToNum(char) 메서드 구현, 인스턴스 생성이 필요 없는 동작이기에 static method로 구현
이후 입력받은 문자열을 toCharArray() 메서드를 통하여 char[] 배열로 변환 후 향상된 for문을 돌면서 걸리는 시간을 계산하여 해결
코드를 업로드해 둔 깃 허브