🖥️ CS/Baekjoon Algorithms

#4604번 Steganography (c++)

한국의 메타몽 2020. 1. 13. 00:04
#include <iostream>
#include <deque>
#include <string>
#include <math.h>
using namespace std;

/*
 1. 문자열을 받는다. 이 문자열은 엔터키 또한 받아내야 한다.
 2. 스페이스바(공백)를 기준으로 덱에 넣는다.
 공백이 홀수개면 0, 짝수개면 1을 넣는다.
 3. 해당 덱은 5개씩 끊어내며, 만약 마지막 5의 배수로
 받아내지 못할경우 5의 배수로 끝나도록 맨 마지막에 0을 넣는다.
 4 해당 덱을 이진수로 변환하여 테이블표대로 출력한다.
 */

int main(void){
    
    deque<int> dq;
    
    while(1)
    {
        string temp;
        getline (cin, temp);
        
        if(temp.size()==1&&temp=="#")
            break; // 아예 종료한다.
        else if (temp.size()==1&&temp=="*")
        {
            // else에서 시행했던 문장을 출력해준다.
            while(1) // dq를 5개씩 만들어야 한다.
            {
                if(dq.size()%5==0)
                    break;
                
                dq.push_back(0);
            }
            
            while(1)
            {
                if (dq.empty())
                    break;
                
                int num = 0;
                
                // 우선 2진법으로 완료 해야 한다.
                
                for(int i=0; i<5; i++)
                {
                    num += pow(2,4-i) * dq.front();
                    dq.pop_front();
                }
                
                if(num == 0)
                    cout << " ";
                else if( 1<= num && num<=26)
                    cout << char('A'-1+num);
                else if(num==27)
                    cout << "'";
                else if(num==28)
                    cout << ",";
                else if(num==29)
                    cout <<"-";
                else if(num==30)
                    cout << ".";
                else if(num==31)
                    cout<< "?";
            }
            cout << endl;
            dq.clear();
        }
        else
        {
            //출력할 문장을 적는다
            int conse=0; // 연속적인 스페이스바의 숫자
            
            for(int i=0; i<temp.size(); i++)
            {
                if(temp[i]==' ') // 문자 char
                    conse ++;
                else
                {
                    if(conse&&conse%2==1) // 홀
                        dq.push_back(0);
                    else if(conse&&conse%2==0) // 짝
                        dq.push_back(1);
                    conse = 0;
                }
            }
            // 끝났을 때도 고려해야한다. 저 위 케이스에 들어가지 못한다.
            if(conse)
            {
                if (conse%2==1)
                    dq.push_back(0); // 홀
                else if(conse%2==0) // 짝
                    dq.push_back(1);
                conse = 0;
            }
        }
    }
    
    
    return 0;
}

'🖥️ CS > Baekjoon Algorithms' 카테고리의 다른 글

#1712번 손익분기점 (c++)  (0) 2020.02.12
#1316번 그룹단어체커 (c++)  (0) 2020.02.11
#1065번 한수 (c++)  (0) 2020.02.08
#4673번 셀프넘버 (c++)  (0) 2020.02.08
#1008번 A/B (c++)  (0) 2020.01.14