Post List

[BOJ] 백준 10545 뚜기뚜기메뚜기

[BOJ] 백준 10545 뚜기뚜기메뚜기



이 문제는 학교 동아리에서 문제풀이 시간 2시간을 전부 할애한 문제 입니다.
알고리즘 자체는 간단합니다. 하지만 문제 해석을 잘못해서 잘못된 답을 출력하여 
많이 헤맸던 문제 입니다. 1시간 55분만에 풀었습니다. 재밌는 문제였습니다. :)

문제의 입력을 잘 체크 해야 합니다.
2 3 4 5 6 7 8 9 1이 입력일 경우, 5를 누르면 나오는 숫자(j k l)이 이제 4를 눌러야 나온다는 뜻 입니다. 알파벳은 26개 밖에 안되므로 각각의 칸에 따라 새로운 번호를 가지도록 코드를 작성했습니다.
그 후 입력 문자열이 어떤 숫자를 가지는지 출력만 해주면 되는 문제 입니다.

소스코드 : 


#include 
#include 
#include 
using namespace std;

int main() {
 vector< vector> v(10 , vector(4 , -1));
    // 이하의 코드는 정해진 칸에 새 번호를 배정하는 코드 입니다.
 for (int cnt = 0; cnt < 9; cnt++) {
  int i;
  cin >> i;
  i = i - 1;
  cin.ignore();
        // 쉽게말하자면, 기존의 버튼에 숫자만 바꿔서 써놓은 거라고 생각하면 됩니다.
   if (i == 0) {
    for (int tmp = 0; tmp < 4; tmp++) {
     v[cnt][tmp] = 0;
    }
   } 
   else if (i == 1) {
    v[cnt][0] = 'a';
    v[cnt][1] = 'b';
    v[cnt][2] = 'c';
   }
   else if (i == 2) {
    v[cnt][0] = 'd';
    v[cnt][1] = 'e';
    v[cnt][2] = 'f';
   }
   else if (i == 3) {
    v[cnt][0] = 'g';
    v[cnt][1] = 'h';
    v[cnt][2] = 'i';
   }
   else if (i == 4) {
    v[cnt][0] = 'j';
    v[cnt][1] = 'k';
    v[cnt][2] = 'l';
   }
   else if (i == 5) {
    v[cnt][0] = 'm';
    v[cnt][1] = 'n';
    v[cnt][2] = 'o';
   }
   else if (i == 6) {
    v[cnt][0] = 'p';
    v[cnt][1] = 'q';
    v[cnt][2] = 'r';
    v[cnt][3] = 's';
   }
   else if (i == 7) {
    v[cnt][0] = 't';
    v[cnt][1] = 'u';
    v[cnt][2] = 'v';
   }
   else if (i == 8) {
    v[cnt][0] = 'w';
    v[cnt][1] = 'x';
    v[cnt][2] = 'y';
    v[cnt][3] = 'z';
   }
  
 }
 string s;
 cin >> s;
 int last = -1;
 bool check = false;
    // 루프를 돌며 문자와 새로운 버튼의 문자가 일치할 경우를 찾습니다.
 for (int i = 0; i < s.length(); i++) {
  check = false;
  for (int j = 0; j < 9; j++) {
   for (int k = 0; k < 4; k++) {
    if ((int)v[j][k] == 0) break;
                // 일치할 경우 할당받은 새로운 번호를 출력.
                // 몇번 출력해야 할지(예를들어 b는 a->b 이므로 2번) 확인 후 반복문 실행
    if (s[i] == v[j][k]) {
                    // 방금 출력된 문자의 번호를 기억하고 있은 후 
                    // 출력해야할 문자가 방금 출력된 문자와 같으면 # 출력.
     if (last == j) cout << '#';
     for (int w = 0; w <= k; w++) {
      cout << j+1;
     }
     check = true;
     last = j;
     //cout << endl;
     break;
    }
   }
   if (check)break;
  }
  if (check) continue;
 }
}

댓글