문제출처: 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 |