본문으로 바로가기

문제 출처 : https://www.acmicpc.net/problem/10545

 

생각을 단순화하여 다음과 같은 함수를 구현하였다.

- 새로 매핑된 번호를 찾아주는 함수.

- 타이핑할 번호와 횟수를 입력받아 그만큼 정답 배열에 기입해주고,

   만일 타이핑할 번호가 정답배열의 마지막 번호와 같다면 '#'도 기입해주는 함수

 

문제풀 시 고려한 사항

- 정답 배열의 최대 크기는 (최악의 경우) 대략 500 이다.

   모든 번호가 (최대 타이핑수 : 4) X (최대 입력 문자 : 100) + (모두 같은 문자일시 #이 99개 추가)

- 정수형 num을 char 정답 배열에 원하는 대로 넣기 위해서는 +48을 해준다.

   = char문자열 표에서 48 ~ 57  =>  0 ~ 9

   = 65 ~ 90  =>  대문자 A ~ Z

   = 97 ~ 122 =>  소문자 a ~ z 를 나타낸다.

 

 

#include <iostream>
#include <string.h>
#include <cstring>
using namespace std;
int button[10] = {0}; // 버튼입력 정보
char text[100]; // 입력할 문자열
char click[500] = {0}; // 클릭할 번호를 저장할 문자열, 최악의 경우는 전부 4번 클릭하면서 #을 같이 기입하는 경우
int position = 0; // click 문자열에 기입할 위치
void typing(int num, int count){ // 쳐야할 번호 몇 번 치는지를 매개변수로 받아서
if(click[position-1] == num + 48){ // 만약 쳐야할 문자가 이전 문자와 동일하다면 # 기입
click[position] = '#';
++position; // 인덱스 증가
}
for(int i = 0;i<count;++i){
click[position+i] = num + 48; // 정수에 48을 더해주면 char일 때의 수가 나온다.
}
position += count; // 횟수 만큼 인덱스 증가
}
int fix_button(int orginal){ // 새로 매핑된 번호 찾아 반환하는 함수
for(int i=1;i<10;++i){
if(button[i] == orginal){
return i;
}
}
}
int main() {
for(int i=1;i<10;++i){
cin>>button[i];
}
cin>>text;
int temp;
int len = strlen(text);
for(int i=0;i<len;++i){
switch (text[i]){
case 'a':
temp = fix_button(2); // temp에 새로 매핑된 번호를 받고,
typing(temp, 1); // typing 함수에 번호와 쳐야할 count를 넘겨준다
break;
case 'b':
temp = fix_button(2);
typing(temp, 2);
break;
case 'c':
temp = fix_button(2);
typing(temp, 3);
break;
case 'd':
temp = fix_button(3);
typing(temp, 1);
break;
case 'e':
temp = fix_button(3);
typing(temp, 2);
break;
case 'f':
temp = fix_button(3);
typing(temp, 3);
break;
case 'g':
temp = fix_button(4);
typing(temp, 1);
break;
case 'h':
temp = fix_button(4);
typing(temp, 2);
break;
case 'i':
temp = fix_button(4);
typing(temp, 3);
break;
case 'j':
temp = fix_button(5);
typing(temp, 1);
break;
case 'k':
temp = fix_button(5);
typing(temp, 2);
break;
case 'l':
temp = fix_button(5);
typing(temp, 3);
break;
case 'm':
temp = fix_button(6);
typing(temp, 1);
break;
case 'n':
temp = fix_button(6);
typing(temp, 2);
break;
case 'o':
temp = fix_button(6);
typing(temp, 3);
break;
case 'p':
temp = fix_button(7);
typing(temp, 1);
break;
case 'q':
temp = fix_button(7);
typing(temp, 2);
break;
case 'r':
temp = fix_button(7);
typing(temp, 3);
break;
case 's':
temp = fix_button(7);
typing(temp, 4);
break;
case 't':
temp = fix_button(8);
typing(temp, 1);
break;
case 'u':
temp = fix_button(8);
typing(temp, 2);
break;
case 'v':
temp = fix_button(8);
typing(temp, 3);
break;
case 'w':
temp = fix_button(9);
typing(temp, 1);
break;
case 'x':
temp = fix_button(9);
typing(temp, 2);
break;
case 'y':
temp = fix_button(9);
typing(temp, 3);
break;
case 'z':
temp = fix_button(9);
typing(temp, 4);
break;
}
}
cout<<click; // 정답 출력
return 0;
}