Post List

[BOJ] 백준 4604 Steganography

[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;
  }
 }
}


댓글