문제 링크입니다: 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 |