10번 다이얼

문제

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

https://www.acmicpc.net/problem/5622

 

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

 

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

 

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

 

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

 

입력

첫째 줄에 알파벳 대문자로 이루어진 단어가 주어진다. 단어의 길이는 2보다 크거나 같고, 15보다 작거나 같다.

 

출력

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

 

문제가 좀 복잡해 보인다. 2번부터 알파벳이 들어가 있고 7, 9에는 4개, 나머지 번호는 3개씩 번호가 있다.

 

 

 

단어가 주어질 때 걸리는 시간을 출력해야 하므로 대응하는 번호를 누르는 데 걸리는 시간을 계산해야 한다.

 

65 - 90

C++

#include <iostream>
#include <string>
using namespace std;
int main(){
    string s;
    cin >> s;
    int sum_time = 0;
    for (int i = 0; i < s.length(); i++){
        int n = s[i] - 'A';
        if (n < 3) //2
            sum_time += 3;
        else if (n < 6) //3
            sum_time += 4;
        else if (n < 9) // 4
            sum_time += 5;
        else if (n < 12) // 5
            sum_time += 6;
        else if (n < 15) // 6
            sum_time += 7;
        else if (n < 19) // 7
            sum_time += 8;
        else if (n < 22) // 8
            sum_time += 9;
        else             // 9
            sum_time += 10;
    }
    cout << sum_time;
    return 0;
}

 

일단 조건에 맞춰서 코드를 작성해 본다.

 

조금 더 간소화시켜서 다이얼의 걸리는 시간 정보를 배열에 모두 담고 이 배열에서 걸리는 시간을 꺼내 쓰는 방법으로 풀어본다.

 

#include <iostream>
#include <string>
using namespace std;
int main(){
    string s;
    cin >> s;
    int dial_times[26] = {
        3, 3, 3,  // 2)A, B, C
        4, 4, 4,  // 3)D, E, F
        5, 5, 5,  // 4)G, H, I
        6, 6, 6,  // 5)J, K, L
        7, 7, 7,  // 6) M, N, O
        8, 8, 8, 8,  // 7) P, Q, R, S
        9, 9, 9,  // 8) T, U, V
        10, 10, 10, 10  // 9) W, X, Y, Z
    };
        
    int sum_time = 0;
    for (char c : s){
        sum_time += dial_times[c - 'A'];
    }
    cout << sum_time;
    return 0;
}

 

알파벳마다 대응하는 배열의 인덱스에 걸리는 시간 정보를 저장해서 조건문 없이 걸리는 시간을 가져와서 사용할 수 있다.

 

배열로 표현한 게 좀 더 보기 쉽고 수정도 편할 거 같아 보인다.

 

C#

using System;
class Program{
    static void Main(string[] args){
        string s = Console.ReadLine();
        int[] dial_times = new int[26]{
            3, 3, 3,       // 2) A, B, C
            4, 4, 4,       // 3) D, E, F
            5, 5, 5,       // 4) G, H, I
            6, 6, 6,       // 5) J, K, L
            7, 7, 7,       // 6) M, N, O
            8, 8, 8, 8,    // 7) P, Q, R, S
            9, 9, 9,       // 8) T, U, V
            10, 10, 10, 10 // 9) W, X, Y, Z
        };
        int sum_time = 0;
        foreach(char c in s){
            sum_time += dial_times[c - 'A'];
        }
        Console.WriteLine(sum_time);
    }
}

 

떠오른 방법 중에는 이렇게 하는 게 제일 간단한 거 같아서 다른 언어들도 동일한 방식으로 진행해 본다.

 

Python

s = input()
dial_times = [
    3, 3, 3,       # 2) A, B, C
    4, 4, 4,       # 3) D, E, F
    5, 5, 5,       # 4) G, H, I
    6, 6, 6,       # 5) J, K, L
    7, 7, 7,       # 6) M, N, O
    8, 8, 8, 8,    # 7) P, Q, R, S
    9, 9, 9,       # 8) T, U, V
    10, 10, 10, 10 # 9) W, X, Y, Z
]
sum_time = 0
for c in s:
    sum_time += dial_times[ord(c) - ord('A')]
print(sum_time)

 

Node.js

const fs = require('fs');
const input = fs.readFileSync('/dev/stdin','utf8').trim().split('');
const dial_times = [
    3, 3, 3,       // 2) A, B, C
    4, 4, 4,       // 3) D, E, F
    5, 5, 5,       // 4) G, H, I
    6, 6, 6,       // 5) J, K, L
    7, 7, 7,       // 6) M, N, O
    8, 8, 8, 8,    // 7) P, Q, R, S
    9, 9, 9,       // 8) T, U, V
    10, 10, 10, 10 // 9) W, X, Y, Z
];
let sum_time = 0;
input.forEach(c => {
    sum_time += dial_times[c.charCodeAt(0) - 'A'.charCodeAt(0)];
});
console.log(sum_time);

 

11번 그대로 출력하기

문제

입력받은 대로 출력하는 프로그램을 작성하시오.

 

입력

입력이 주어진다. 입력은 최대 100줄로 이루어져 있고, 알파벳 소문자, 대문자, 공백, 숫자로만 이루어져 있다. 각 줄은 100글자를 넘지 않으며, 빈 줄은 주어지지 않는다. 또, 각 줄은 공백으로 시작하지 않고, 공백으로 끝나지 않는다. 은 대로 출력하는 프로그램을 작성하시오.

 

출력

입력받은 그대로 출력한다.

 

이번엔 상당히 간단한 문제가 주어진다. 입력받은 문자를 그대로 출력해야 한다. 

 

C++

#include <iostream>
#include <string>
using namespace std;
int main(){
    string s;
    while (getline(cin, s)){
        cout << s << "\n";
    }
    return 0;
}

 

입력을 줄 단위로 구분해서 그대로 출력해야 하기 때문에 getline() 함수를 사용한다.

 

getline() 사용하면 줄 단위로 입력을 처리할 수 있다.

 

C#

using System;
class Program{
    static void Main(string[] args){
        string s;
        while ((s = Console.ReadLine()) != null){
            Console.WriteLine(s);
        }
    }
}

 

ReadLine()은 기본적으로 줄 단위로 입력받기 때문에 입력이 없을 때까지 받고 출력하고를 반복하면 된다.

 

Python

while True:
    try:
        s = input()
        if s == '':
            break
        print(s)
    except EOFError:
        break

 

입력이 없을 때 발생하는 EOFError를 처리하기 위해서 try ~ except를 사용한다.

 

Node.js

const fs = require('fs');
const input = fs.readFileSync('/dev/stdin', 'utf8').trim().split('\n');
input.forEach(s => {
   console.log(s); 
});

 

문자열 챕터의 마지막 문제였는데 상당히 간단했다.

728x90
반응형

+ Recent posts