문제
상근이의 할머니는 아래 그림과 같이 오래된 다이얼 전화기를 사용한다.
전화를 걸고 싶은 번호가 있다면, 숫자를 하나를 누른 다음에 금속 핀이 있는 곳 까지 시계방향으로 돌려야 한다. 숫자를 하나 누르면 다이얼이 처음 위치로 돌아가고, 다음 숫자를 누르려면 다이얼을 처음 위치에서 다시 돌려야 한다.
숫자 1을 걸려면 총 2초가 필요하다. 1보다 큰 수를 거는데 걸리는 시간은 이보다 더 걸리며, 한 칸 옆에 있는 숫자를 걸기 위해선 1초씩 더 걸린다.
상근이의 할머니는 전화 번호를 각 숫자에 해당하는 문자로 외운다. 즉, 어떤 단어를 걸 때, 각 알파벳에 해당하는 숫자를 걸면 된다. 예를 들어, UNUCIC는 868242와 같다.
할머니가 외운 단어가 주어졌을 때, 이 전화를 걸기 위해서 필요한 최소 시간을 구하는 프로그램을 작성하시오.
문제 해석
먼저 문제를 이해하기 어려울 수도 있다.
간단하게 정리하면,
1. 다이얼 전화기는 전화번호를 한 숫자씩 입력해야한다.
2. 할머니는 전화번호 대신, 전화번호 숫자 버튼에 자세히 보면 존재하는 알파벳으로 전화를 건다.
3. 예를들면 숫자 2 의 경우는 ABC, 숫자 9의 경우는 WXYZ 이다.
4. 따라서 문자열 'U N U C I C' 는 '8 6 8 2 4 2' 이다.
5. 전화는 문자열로 걸게 되고, 각 문자에 해당하는 숫자를 구하고, 각 숫자에 걸리는 시간을 모두 더하면 된다.
6. 각 숫자 사이는 1초가 걸리고, 숫자 1 은 2초가 걸리므로, 숫자 2는 3초, 숫자 3은 4초 ... 숫자 9 는 10초가 걸린다.
풀이
#include <iostream>
#include <string>
using namespace std;
int AlphaToNumber(string alpha, int i);
int main()
{
string dial; // 전화를 걸 문자열 입력
int time = 0; // 걸리는 시간
cin >> dial;
for (int i = 0; i < dial.length(); i++) // 문자열 길이까지
{
time += AlphaToNumber(dial, i) + 1; // 각 문자를 숫자로 환산
}// 걸리는 시간은 각 숫자마다 숫자에 + 1한 값
cout << time;
}
int AlphaToNumber(string alpha, int i) // 문자 하나를 숫자로 변경
{
int numberDial;
if (alpha[i] >= 'A' && alpha[i] <= 'C') // A~C 사이는 2
{
numberDial = 2;
}
else if (alpha[i] >= 'D' && alpha[i] <= 'F')
{
numberDial = 3;
}
else if (alpha[i] >= 'G' && alpha[i] <= 'I')
{
numberDial = 4;
}
else if (alpha[i] >= 'J' && alpha[i] <= 'L')
{
numberDial = 5;
}
else if (alpha[i] >= 'M' && alpha[i] <= 'O')
{
numberDial = 6;
}
else if (alpha[i] >= 'P' && alpha[i] <= 'S')
{
numberDial = 7;
}
else if (alpha[i] >= 'T' && alpha[i] <= 'V')
{
numberDial = 8;
}
else if (alpha[i] >= 'W' && alpha[i] <= 'Z')
{
numberDial = 9;
}
return numberDial; // 숫자로 리턴
}
1. 전화를 걸 문자열을 대문자로 입력받는다.
2. 문자열에서 각 문자를 범위에 맞게 숫자로 변환해서 반환하는 함수를 작성한다.
3. 숫자가 걸리는 시간은 숫자 + 1 이므로, AlphaToNumber 함수를 호출하여 해당 숫자에 1을 더한 값을 time에 저장한다.
4. time을 출력한다.
'백준 알고리즘 단계별 풀이 (문제 수) > 문자열 (10)' 카테고리의 다른 글
[C++] 그룹 단어 체커 : 1316번 (0) | 2022.07.03 |
---|---|
[C++] 상수(세자리 수 뒤집어서 크기비교) : 2908번 (0) | 2022.07.03 |
[C++] 단어의 갯수 : 1152번 (0) | 2022.07.03 |
[C++] 단어 공부(가장 많은 알파벳 찾기) : 1157번 (0) | 2022.07.02 |
[C++] 문자열 반복 / 단어 재조합하기 : 2675번 (0) | 2022.06.28 |