BOJ 5622
위 문제는 백준 사이트의 알고리즘 5622 문제에 관한 설명입니다.
문제
상근이의 할머니는 아래 그림과 같이 오래된 다이얼 전화기를 사용한다.
전화를 걸고 싶은 번호가 있다면, 숫자를 하나를 누른 다음에 금속 핀이 있는 곳 까지 시계방향으로 돌려야 한다. 숫자를 하나 누르면 다이얼이 처음 위치로 돌아가고, 다음 숫자를 누르려면 다이얼을 처음 위치에서 다시 돌려야 한다.
숫자 1을 걸려면 총 2초가 필요하다. 1보다 큰 수를 거는데 걸리는 시간은 이보다 더 걸리며, 한 칸 옆에 있는 숫자를 걸기 위해선 1초씩 더 걸린다.
상근이의 할머니는 전화 번호를 각 숫자에 해당하는 문자로 외운다. 즉, 어떤 단어를 걸 때, 각 알파벳에 해당하는 숫자를 걸면 된다. 예를 들어, UNUCIC는 868242와 같다.
할머니가 외운 단어가 주어졌을 때, 이 전화를 걸기 위해서 필요한 시간을 구하는 프로그램을 작성하시오.
입력
첫째 줄에 알파벳 대문자로 이루어진 단어가 주어진다. 단어는 2글자~15글자로 이루어져 있다.
import java.util.Scanner;
class Main {
public static void main(String[] args) {
Scanner sc =new Scanner(System.in);
char array[]= sc.next().toCharArray();
int sum = 0;
for (int i =0;i<array.length;i++)
{
sum += 2;
switch (array[i]) {
case 'W':
case 'X':
case 'Y':
case 'Z':
sum += 1;
case 'T':
case 'U':
case 'V':
sum += 1;
case 'P':
case 'Q':
case 'R':
case 'S':
sum += 1;
case 'M':
case 'N':
case 'O':
sum += 1;
case 'J':
case 'K':
case 'L':
sum += 1;
case 'G':
case 'H':
case 'I':
sum += 1;
case 'D':
case 'E':
case 'F':
sum += 1;
case 'A':
case 'B':
case 'C':
sum += 1;
}
}
System.out.println(sum);
}
}
제가 푼 소스코드입니다.
음.. switch를 사용하면 풀 수 있었지만 뭔가 불만족스럽습니다.
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
public class Main {
public static int time;
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
char[] dials = br.readLine().toCharArray();
for(char c: dials) {
time += (c-'A')/3+3;
if(c=='S'||c=='V'||c=='Y'||c=='Z')
time--;
}
System.out.print(time);
}
}
다른분이 푸신 코드입니다.
역시나 훨신 깔끔하게 푸는 방법이 있었습니다.
(c-‘A’)/3+3에서 c/3+3 과 c/3+2는 차이가 1이라는 점을 활용하셨다고 합니다.
상상도 못했던 방법이라 정말 놀랍습니다..
처음 이 코드를 봤을때 진짜 깔끔하고 이쁘다라는 생각이 많이 들었습니다.
저도 저런 코드를 짤 수 있도록 조금 더 노력하는 모습을 보여야겠습니다.