문제 출처 : 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;
}
'BOJ 백준 > 문자열' 카테고리의 다른 글
백준 09935 - 문자열 폭발 (0) | 2020.11.12 |
---|---|
백준 05670 - 휴대폰 자판 (0) | 2020.11.07 |
백준 14425 - 문자열 집합 (0) | 2020.11.07 |
백준 10988 - 팰린드롬인지 확인하기 (0) | 2020.01.07 |