본문으로 바로가기

백준 10545 - 뚜기뚜기메뚜기

category BOJ 백준/문자열 2020. 1. 4. 00:36

문제 출처 : 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