티스토리 뷰

Source

문제

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

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

숫자 1을 걸려면 총 2초가 필요하다. 1보다 큰 수를 거는데 걸리는 시간은 이보다 더 걸리며, 한 칸 옆에 있는 숫자를 걸기 위해선 1초씩 더 걸린다.

상근이의 할머니는 전화 번호를 각 숫자에 해당하는 문자로 외운다. 즉, 어떤 단어를 걸 때, 각 알파벳에 해당하는 숫자를 걸면 된다. 예를 들어, UNUCIC는 868242와 같다.

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

입력

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

출력

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

예제 입력 1

UNUCIC

예제 출력 1

36

해설

단순한 문제다. if else 문이 길어서 노가다 코드라는 점 때문에 마음에 들지 않는다.

아스키코드상 영문자는 일정한 정수값으로 대치될 수 있다. 그렇기에 대소 비교가 가능하므로 위 문제에서 A, B, C 문자에 대응하는 2는 if문으로 if( dial >= 'A' && dial <= 'C')로 표현할 수 있다. 이와 동일한 방식으로 다른 다이얼 숫자를 표현하고 각 if 문에 해당할 때 추가되는 시간을 더해주면 된다.

소스코드: C

#include <stdio.h>

int TransToTime(char dial);

int TransToTime(char dial)
{
    int times = 2;
    if (dial >= 'A' && dial <= 'C') {
        times += 1;
    } else if (dial >= 'D' && dial <= 'F') {
        times += 2;
    } else if (dial >= 'G' && dial <= 'I') {
        times += 3;
    } else if (dial >= 'J' && dial <= 'L') {
        times += 4;
    } else if (dial >= 'M' && dial <= 'O') {
        times += 5;
    } else if (dial >= 'P' && dial <= 'S') {
        times += 6;
    } else if (dial >= 'T' && dial <= 'V') {
        times += 7;
    } else if (dial >= 'W' && dial <= 'Z') {
        times += 8;
    } else {
        times += 8;
    }

    return times;
}

int main(int argc, char *argv[])
{
    char input_str[16];
    int i, sum = 0;

    scanf("%s", input_str);

    for (i = 0; input_str[i] != '\0'; ++i) {
        sum += TransToTime(input_str[i]);    
    }

    printf("%d\n", sum);
    return 0;
}

댓글
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
«   2025/02   »
1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28
글 보관함
02-18 12:33