[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; } }
댓글
댓글 쓰기