9226번 : 도깨비말
문제 )
도깨비말은 언어 유희 중 하나로, 글자를 특정 법칙에 따라 재구성하는 것을 말한다.
영어권에서는 피그라틴어라는 것이 있다. 주로 어린이들이 많이 쓰는 데, 남들에게 무슨 말인지 모르게 하기 위해 종종 쓴다.
여기엔 규칙이 있는데, 맨 앞글자가 모음이 아닐때 까지 맨 앞 글자를 어미로 돌린 후 그 끝에 ay를 붙여서 완성한다. 예를 들면 frog는 ogfray이 된다. 만약 맨 앞자음이 없는 apple과 같은 경우는 끝에 ay만 붙여 appleay가 된다. 또는, 단어에 모음이 없는 경우에도 단어의 끝에 ay만 붙인다.
주어진 단어를 피그라틴어로 바꾸는 프로그램을 작성하시오.
입력 :
한 줄에 하나의 단어씩 주어진다. 그리고 마지막 줄에 #을 입력받고 끝낸다.
주어진 단어는 20자를 넘지 않고 공백없이 소문자로만 이루어져있다. 여기서 모음이란 'a', 'e', 'i', 'o', 'u' 를 말한다.
출력 :
한 줄에 하나씩 피그라틴어를 출력한다.
풀이)
자꾸 메모리 초과가 떠서
이유가 대체 뭘까 고민이 많이 되었던 문제이다.
메모리 초과가 났던 이유는 모음을 발견하지 못했을 경우 계속해서 while문이 돌아
word의 길이를 늘려갔고 이 때문에 났던 것이었다.
따라서 모음이 하나도 발견되지 않았을 경우를 따로 분기처리하여 마지막에 발견되지 않았을 경우
초기에 저장해놨던 문자열의 길이대로 출력해주었다.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
|
#include <iostream>
#include <string>
using namespace std;
int main()
{
while (1)
{
string word;
cin >> word;
if (word == "#") break;
// 피그라틴어 만들기
int start = 0;
bool flag = 0;
int word_len = (int)word.length();
while (1)
{
if (start > word_len + 1)
{
flag = 1;
break;
}
if (word[start] == 'a' || word[start] == 'e' || word[start] == 'i' || word[start] == 'o' || word[start] == 'u') break;
else
{
word += word[start];
start++;
}
}
// 모음이 하나도 안 발견된 경우
if (flag)
{
for (int i = 0; i < word_len; i++)
{
cout << word[i];
}
}
else
{
int len = (int)word.length();
for (int i = start; i < len; i++)
{
cout << word[i];
}
}
cout << "ay\n";
}
return 0;
}
|
cs |
출처 : https://www.acmicpc.net/problem/9226
9226번: 도깨비말
도깨비말은 언어 유희 중 하나로, 글자를 특정 법칙에 따라 재구성하는 것을 말한다. 영어권에서는 피그라틴어라는 것이 있다. 주로 어린이들이 많이 쓰는 데, 남들에게 무슨 말인지 모르게 하
www.acmicpc.net
'Develop > 백준 (Cpp)' 카테고리의 다른 글
[백준] 2703번 : Cryptoquote (C++) (0) | 2023.02.17 |
---|---|
[백준] 8932번 : 7종 경기 (C++) (0) | 2023.02.17 |
[백준] 5724번 : 파인만 (C++) (0) | 2023.02.16 |
[백준] 1568번 : 새 (C++) (0) | 2023.02.15 |
[백준] 2556번 : 별 찍기 - 14 (C++) (0) | 2023.02.15 |