문제출처: https://www.acmicpc.net/problem/9226


문제

도깨비말은 언어 유희 중 하나로, 글자를 특정 법칙에 따라 재구성하는 것을 말한다.

영어권에서는 피그라틴어라는 것이 있다. 주로 어린이들이 많이 쓰는 데, 남들에게 무슨 말인지 모르게 하기 위해 종종 쓴다. 

여기엔 규칙이 있는데, 맨 앞글자가 모음이 아닐때 까지 맨 앞 글자를 어미로 돌린 후 그 끝에 ay를 붙여서 완성한다. 예를 들면 frog는 ogfray이 된다. 만약 맨 앞자음이 없는 apple과 같은 경우는 끝에 ay만 붙여 appleay가 된다. 또는, 단어에 모음이 없는 경우에도 단어의 끝에 ay만 붙인다.

주어진 단어를 피그라틴어로 바꾸는 프로그램을 작성하시오.


입력

한 줄에 하나의 단어씩 주어진다. 그리고 마지막 줄에 #을 입력받고 끝낸다.

주어진 단어는 20자를 넘지 않고 공백없이 소문자로만 이루어져있다. 여기서 모음이란 'a', 'e', 'i', 'o', 'u' 를 말한다.


출력

한 줄에 하나씩 피그라틴어를 출력한다.

풀이
c++ string의 일부분의 문자열을 반환하는 substr기능을 익히기에 좋은문제입니다. 
예시를 보면 입력한문자열에서 모음을 만나면 그 index부터 끝까지 출력 후 index이전의 자음들을 차례대로 출력하고있음을 알 수 있습니다.
주황색부분은 string의 substr을 이용하고 파란색부분은 큐를 이용해 저장해놨다가 순서대로 꺼내 출력합니다.

코드
#include<iostream>
#include<queue>
#include<string>
using namespace std;
int main()
{

	string a;
	while (1)
	{
		cin >> a;
		queue<char>q;
		if (a[0] == '#')
			break;
		if (a[0] == 'a' || a[0] == 'e' || a[0] == 'i' || a[0] == 'o' || a[0] == 'u')
			cout << a << "ay" << endl;
		else
		{
			q.push(a[0]);
			for (int i = 1; i<a.size(); i++)
			{
				if (a[i] == 'a' || a[i] == 'e' || a[i] == 'i' || a[i] == 'o' || a[i] == 'u')
				{
					cout << a.substr(i, a.size() - i);
					break;
				}
				else q.push(a[i]);
			}
			while (!q.empty())
			{
				cout << q.front();
				q.pop();
			}
			cout << "ay" << endl;
		}
	}
}



결과


'문제풀이(BOJ) > 문자열' 카테고리의 다른 글

[백준 1075] 나누기(string연습!!)  (0) 2020.01.06
[백준 3181] 줄임말 만들기  (0) 2020.01.02
[백준 1431] 시리얼 번호  (0) 2019.12.04
[백준 2703] Cryptoquote  (0) 2019.12.02
[백준 11536] 줄 세우기  (0) 2019.12.02

+ Recent posts