문제
10년 전, 구름이가 처음으로 구매했던 휴대폰은 폴더 폰이다. 폴더 폰의 자판은 최근의 휴대폰의 입력 방식과는 차이가 있다. 폴더 폰의 자판 형식은 아래와 같다.
9개의 입력 버튼으로 이루어져 있으며, 각 버튼의 첫 번째 숫자로 버튼을 부를 수 있다. 한 번 버튼을 누르면 숫자가 입력이 되고, 여러 번 누르면 자판에 보이는 문자들로 순서대로 바뀐다.
예를 들면 [버튼 5]를 한 번 누르면 5가 입력이 되지만, [버튼 5]를 세 번 누르면 k가 입력된다. 또 [버튼 5]를 5번 이상 누르게 되면 다시 처음 숫자가 입력된다. [버튼 7]이나 [버튼 1]은 6번 이상일 때 동일하게 된다.
10년 전 구름이가 구매한 폴더 폰을 오랜만에 꺼내서 작동을 했더니, 휴대폰이 고장이 났다는 사실을 발견했다. 같은 [버튼]을 여러 번 눌렀을 때, 문자가 바뀌지 않고 숫자가 그대로 하나씩 입력되는 것이다. 구름이를 도와 주어진 수열을 바탕으로 구름이가 실제로 입력하려고 했던 문장을 출력하시오.
문제에 제시된 대로 keyboard 배열을 생성한 뒤로는 어렵지 않게 문제를 해결할 수 있었다.
입력에 대해 누른 자판의 번호(pushNum)와 누른 횟수(pushCnt)를 구하고 이때 생성되는 문자를 더해주었다.
예를들어, 4번 자판을 3번 누를 경우 pushNum : 4, pushCnt = 2가 된다. 여기서 pushCnt 가 3이 아니라 2인 이유는 밑에 설명할 모듈러 연산 처리와 내가 생성한 keyboard배열의 형태를 살펴보면 이해할 수 있다.
주의해야 할 점은 동일한 자판을 연속하여 누를 시 계속해서 문자가 변경되는데 해당 자판의 마지막 문자에서 추가적으로 눌러질 경우 문자 변경이 다시 처음 문자부터 반복된다는 것이다. 이를 위해 해당 자판이 가지고 있는 문자의 개수를 통해 모듈러 연산을 해주도록 하였다.
#include <iostream>
#include <vector>
#include <string>
using namespace std;
int n;
vector<char> keyboard[10] = {
{},
{'1', '.', ',' , '?', '!'},
{'2', 'A', 'B', 'C'},
{'3', 'D', 'E', 'F'},
{'4', 'G', 'H', 'I'},
{'5', 'J', 'K', 'L'},
{'6', 'M', 'N', 'O'},
{'7', 'P', 'Q', 'R', 'S'},
{'8', 'T', 'U', 'V'},
{'9', 'W', 'X', 'Y', 'Z'}
};
int main() {
ios::sync_with_stdio(false); cin.tie(0); cout.tie(0);
cin >> n;
string s = "", input;
cin >> input;
for (int i = 0; i < n;) {
int pushNum = input[i] - '0';
int pushCnt = 0;
int j;
for (j = i + 1; j < n; j++) {
if (input[j] != input[i]) break;
pushCnt++;
}
int mod = keyboard[pushNum].size();
s += keyboard[pushNum][pushCnt % mod];
i = j;
}
cout << s;
}
'Alrogithm > 구름(GOORM)' 카테고리의 다른 글
[구름 알고리즘 먼데이 챌린지] Week3 : 4. 순환하는 수로 (0) | 2022.11.07 |
---|---|
[구름 알고리즘 먼데이 챌린지] Week3 : 3. 구름이의 여행 (2) | 2022.11.05 |
[구름 알고리즘 먼데이 챌린지] Week3 : 1. 0커플 (2) | 2022.11.05 |
[구름 알고리즘 먼데이 챌린지] Week2 : 3. 출석부 (0) | 2022.11.04 |
[구름 알고리즘 먼데이 챌린지] Week2 : 1. 합격자 찾기 (0) | 2022.11.04 |