[BOJ] 백준 4604 Steganography
문제 링크 : https://www.acmicpc.net/problem/4604
이 문제는 cryptography의 한 분야 이다.
한 문장을 받고 단어와 단어사이의 공백의 개수가 짝수이면 1, 홀수이면 0을 저장하고 5개 비트 단위로 끊어 문자로 변환하는 문제이다.
1. 문자열 입력
- getline(cin, string_name, '#'); 이용하였다. '#'이 입력되면 문자열 입력도 종료된다.2. ' * ' 이 입력되면 해당하는 비트변환 문자를 출력해야 한다.
- deque을 이용하여 비트들을 모두 저장하였다.- 5개 비트씩 끊어읽어야 한다.
소스 코드 :
#include#include #include using namespace std; // 이진수 -> 문자로 변환하는 함수. string TranDec(deque dq) { int dsize = dq.size(); bool arr[5] = { 0, }; int sum = 0; int cnt = 0; string str = ""; for (int i = 0; i < dsize; i++) { arr[cnt++] = dq.front(); dq.pop_front(); // cnt가 5 이상이거나, 현재 인덱스가 덱의 마지막 배열인경우 //(입력이 1인경우, 10000으로 채워줌) if (cnt >= 5 || i == dsize-1) { cnt = 0; sum = 0; for (int w = 4; w >= 0; w--) { if (arr[4-w]) { switch (w) { case 4: sum += 16; break; case 3: sum += 8; break; case 2: sum += 4; break; case 1: sum += 2; break; case 0: sum += 1; break; } } arr[4 - w] = 0; } if (sum == 31) str+= '?'; else if (sum == 30) str += '.'; else if (sum == 29) str += '-'; else if (sum == 28) str += ','; else if (sum == 27) str += '\''; else if (sum == 0) str += ' '; else str += (sum + 64); } } return str; } int main() { string s; // 문제는 '#'이 입력되면 종료. getline(cin, s, '#'); // 비트들을 담을 덱 선언. deque dq; // 문자열 맨 마지막에 '#' 추가. s += '#'; int i = -1; while(true) { i++; // '#' 입력시 종료. if (s[i] == '#') { break; } // '*' 입력시 출력. else if (s[i] == '*') { // 지금까지 입력받은 deque 을 이용하여 이진수 -> 문자 계산, 출력 // 덱 초기화. cout << TranDec(dq) << endl; dq.clear(); } // 공백을 만났을때, 공백 개수만큼 count 하고, 홀/짝 구분. else if (s[i] == ' '){ int tmp = i; int cnt = 0; while (s[tmp++] == ' ') { cnt++; } bool b = cnt % 2 == 0 ? true : false; dq.push_back(b); // 이미 지나온 공백(들)은 체크하지 않기위해 건너 뜀. i = tmp - 1; } } }
댓글
댓글 쓰기