알고리즘/BOJ

백준 4604번 Steganography

꾸준함. 2018. 9. 16. 12:42

문제 링크입니다: https://www.acmicpc.net/problem/4604


문자열 파싱과 덱을 이용하여 풀어야하는 문제였습니다.


알고리즘은 아래와 같습니다.

1. 공백 포함 문자열을 입력받아야하므로 getline을 이용하여 문자열을 입력받습니다.

2. 공백이 오면 연속 몇개가 오는지 확인합니다.

i) 홀수 개면 덱에 0을 push_back 하고

ii) 짝수 개면 덱에 1을 push_back 합니다.

3. *이 입력되면 메시지가 끝난 것이므로 결과를 출력하기 시작합니다.

i) 덱의 사이즈가 5의 배수가 되도록 0을 push_back합니다.

ii) 5개씩 pop_front하여 이진수를 십진수로 바꾸고 결과에 따라 문자를 출력합니다.

iii) 마지막에 개행을 해줍니다.

4. #이 입력되면 프로그램을 끝냅니다. 


#include <iostream>

#include <string>

#include <deque>

#include <cmath>

using namespace std;

 

int main(void)

{

        ios_base::sync_with_stdio(0);

        cin.tie(0);

 

        deque<int> dq;

        while(1)

        {

                 string temp;

                 getline(cin, temp);

 

                 if (temp.size() == 1 && temp == "#")

                         break;

                 //결과 출력

                 else if (temp.size() == 1 && temp == "*")

                 {

                         //5의 배수로 맞춰준다

                         while (1)

                         {

                                 if (dq.size() % 5 == 0)

                                          break;

 

                                 dq.push_back(0);

                         }

 

                         //결과 출력

                         while (1)

                         {

                                 if (dq.empty())

                                          break;

 

                                 int result = 0;

                                 for (int i = 0; i < 5; i++)

                                 {

                                          result += dq.front()*pow(2, 4 - i);

                                          dq.pop_front();

                                 }

 

                                 if (result == 0)

                                          cout << " ";

                                 else if (1 <= result && result <= 26)

                                          cout << char(result - 1 + 'A');

                                 else if (result == 27)

                                          cout << "'";

                                 else if (result == 28)

                                          cout << ",";

                                 else if (result == 29)

                                          cout << "-";

                                 else if (result == 30)

                                          cout << ".";

                                 else

                                          cout << "?";

                         }

                         cout << "\n";

                         dq.clear();

                 }

                 else

                 {

                         int consecutive = 0; //연속 공백 수

                         for (int i = 0; i < temp.size(); i++)

                                 if (temp[i] == ' ')

                                          consecutive++;

                                 else

                                 {

                                          if (consecutive && consecutive % 2)

                                                  dq.push_back(0);

                                          else if(consecutive && consecutive % 2 == 0)

                                                  dq.push_back(1);

                                          consecutive = 0;

                                 }

 

                         if (consecutive)

                         {

                                 if (consecutive % 2)

                                          dq.push_back(0);

                                 else

                                          dq.push_back(1);

                                 consecutive = 0;

                         }

                 }

        }

        return 0;

}


개발환경:Visual Studio 2017


지적, 조언, 질문 환영입니다! 댓글 남겨주세요~

반응형

'알고리즘 > BOJ' 카테고리의 다른 글

백준 11775번 SLON  (4) 2018.09.18
백준 2879번 코딩은 예쁘게  (0) 2018.09.18
백준 4673번 셀프 넘버  (0) 2018.09.16
백준 10552번 DOM  (0) 2018.09.16
백준 10551번 STROJOPIS  (0) 2018.09.16