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

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


문제

다솜이는 기타를 많이 가지고 있다. 그리고 각각의 기타는 모두 다른 시리얼 번호를 가지고 있다. 다솜이는 기타를 빨리 찾아서 빨리 사람들에게 연주해주기 위해서 기타를 시리얼 번호 순서대로 정렬하고자 한다.

모든 시리얼 번호는 알파벳 대문자 (A-Z)와 숫자 (0-9)로 이루어져 있다.

시리얼번호 A가 시리얼번호 B의 앞에 오는 경우는 다음과 같다.

  1. A와 B의 길이가 다르면, 짧은 것이 먼저 온다.
  2. 만약 서로 길이가 같다면, A의 모든 자리수의 합과 B의 모든 자리수의 합을 비교해서 작은 합을 가지는 것이 먼저온다. (숫자인 것만 더한다)
  3. 만약 1,2번 둘 조건으로도 비교할 수 없으면, 사전순으로 비교한다. 숫자가 알파벳보다 사전순으로 작다.

시리얼이 주어졌을 때, 정렬해서 출력하는 프로그램을 작성하시오.


입력

첫째 줄에 기타의 개수 N이 주어진다. N은 1,000보다 작거나 같다. 둘째 줄부터 N개의 줄에 시리얼 번호가 하나씩 주어진다. 시리얼 번호의 길이는 최대 50이고, 알파벳 대문자 또는 숫자로만 이루어져 있다. 시리얼 번호는 중복되지 않는다.


출력

첫째 줄부터 차례대로 N개의 줄에 한줄에 하나씩 시리얼 번호를 정렬한 결과를 출력한다.


풀이

정렬 때 사용하는  stl의 sort함수를 적절히 수정하여 풀 수 있습니다.

1. 스트링형 벡터로 입력을 받습니다.(string s[MAX]로 선언해도됩니다.)

2.정렬 함수에 문자열의 사이즈가 같을 때, 다를 때를 각각 따로 계산합니다.

3. 같을 때는 문제의1번조건으로 길이가 짧은 문자열을 반환하고, 다를 때는 각 문자열의 숫자의 합을 구해서 더 작은 합을 갖는 문자열을 반환합니다. if와 else조건에도 맞지않으면 문제의 3번조건대로 반환하므로 else바깥에 return a<b;를 선언해줍니다.


코드

#include<iostream>
#include<algorithm>
#include<vector>
using namespace std;
bool compare(const string& a, const string& b)
{
	if (a.size() != b.size()) 
		return a.size() < b.size();
	else 
	{
		int asum = 0, bsum = 0;
		for (int i = 0; i < a.size(); i++)
		{
			if (a[i] >= '0' && a[i] <= '9')
				asum += a[i] - '0';
			if (b[i] >= '0' && b[i] <= '9')
				bsum += b[i] - '0';
		}
		if(asum!=bsum)
		return asum < bsum;
	}
	return a < b;
}
int main()
{
	int n;
	cin >> n;
	vector<string>v(n);
	for (int i = 0; i < n; i++)
		cin >> v[i];

	sort(v.begin(), v.end(), compare);
	for (int i = 0; i < n; i++)
		cout << v[i] << endl;
}


결과



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

[백준 3181] 줄임말 만들기  (0) 2020.01.02
[백준 9226] 도깨비말  (0) 2019.12.06
[백준 2703] Cryptoquote  (0) 2019.12.02
[백준 11536] 줄 세우기  (0) 2019.12.02
[백준10174] 팰린드롬  (0) 2019.12.02

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

문제

Cryptoquote는 어떤 메시지가 있을 때, 각 알파벳을 다른 알파벳으로 변환해 암호화 하는 방법이다.

예를 들어, HPC PJVYMIY란 메시지가 있을 때, 이를 원래 메시지로 바꾼다면 ACM CONTEST가 된다.

위의 예를 바꾸는 규칙은 H=A, P=C, C=M, J=O, V=N, Y=T, M=E, I=S이다. 이처럼 Cryptoquote를 하려면, 문자와 문자 사이의 규칙이 있어야 한다.

암호화된 메시지와 문자와 문자 사이의 규칙이 주어졌을 때, 이를 원래 메시지로 바꾸는 프로그램을 작성하시오.


입력

첫째 줄에 테스트 케이스의 개수 T(1 ≤ T ≤ 1000)가 주어진다. 각 테스트 케이스는 다음과 같이 두 줄로 구성되어 있다.

테스트 케이스의 첫째 줄에는 암호화된 메시지가 주어지고, 둘째 줄에는 변환 규칙이 주어진다. 변환 규칙은 알파벳 대문자 26글자로 이루어져있고, 

첫 번째 문자는 A에 해당하는 문자, 두 번째는 B, ..., 26번째는 Z에 해당하는 문자이다. 변환 규칙은 중복되지 않는다. 암호화된 메시지에는 공백이 있을 수 있고, 이것은 원래 메시지에도 포함되어야 한다.


출력

각 테스트 케이스에 대해서 한 줄에 하나씩 원래 메시지를 출력한다.


풀이

1.입력받을 bef, 변경된 알파벳의정보를 저장할 aft string을 선언한다.

2. bef[0]은 aft문자열에서 알파벳bef[0]의 인덱스를 갖는 알파벳으로 변한다.

주의:n을 입력받고 버퍼에남은 개행문자를 지우고 문자열을 입력받아야한다.


코드

#include<iostream>
#include<vector>
#include<string>
using namespace std;
int main()
{
	int n;
	cin >> n;
	cin.ignore();
	for (int i = 0; i < n; i++)
	{
		string bef, aft;
		getline(cin, bef);
		getline(cin, aft);
		int size = bef.size();
		for (int i = 0; i < size; i++)
		{
			if (bef[i] == ' ')
				cout << " ";
			else
			{
				cout << aft[bef[i] - 'A'];
			}
		}cout << endl;
	}
	

}


결과




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

[백준 9226] 도깨비말  (0) 2019.12.06
[백준 1431] 시리얼 번호  (0) 2019.12.04
[백준 11536] 줄 세우기  (0) 2019.12.02
[백준10174] 팰린드롬  (0) 2019.12.02
[백준2935]소음  (0) 2019.12.01

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


문제

악독한 코치 주혁은 선수들을 이름 순으로 세우는 것을 좋아한다. 더 악독한 것은 어떤 순서로 서야할지도 알려주지 않았다! 

선수들의 이름이 주어질 때 어떤 순서로 이루어져있는지 확인해보자.


입력

첫째 줄에 N개의 이름이 주어진다. (2 ≤ N ≤ 20)

다음 N개의 줄에는 각 선수들의 이름이 주어진다. 이름은 2 이상 12 이하의 대문자로만 이루어져있다. 선수의 이름은 중복되지 않는다.


출력

이름이 증가하는 순으로 나타나면 INCREASING, 감소하는 순이면 DECREASING을 한 줄에 출력한다.

 만약 위의 두 경우가 아니라면 NEITHER를 출력한다.


알고리즘

1.문자열끼리 비교해야하므로 2차원배열(행:N개의이름, 열:이름의 길이)를 선언한다.

2. 증가,감소를 판별하기위해 각각의 bool형자료형의 2변수를 선언한다.

3.첫문자열~마지막 문자열까지 차례대로 비교하며 증감을 파악한다.

4. inc, dec의 결과에따라 결과를 출력한다.

#include<iostream>
#include<algorithm>
#include<cstring>
using namespace std;
char word[20][13];
int main()
{
	int n;
	cin >> n;
	cin >> word[0];
	bool inc = true,  dec = true;
	for(int i=1;i<n;i++)
	{
		cin >> word[i];
		int comp = strcmp(word[i - 1], word[i]);
		if (comp > 0)//B->A꼴이면 
			inc = false;
		else if (comp < 0)
			dec = false;
	}
	if (inc)
		cout << "INCREASING";
	else if (dec)
		cout << "DECREASING";
	else
		cout << "NEITHER";
	cout << endl;

}



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

[백준 9226] 도깨비말  (0) 2019.12.06
[백준 1431] 시리얼 번호  (0) 2019.12.04
[백준 2703] Cryptoquote  (0) 2019.12.02
[백준10174] 팰린드롬  (0) 2019.12.02
[백준2935]소음  (0) 2019.12.01

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


알고리즘 설명

1. 입력한 문자열의 길이/2의 횟수만큼 문자열의 (첫글자,마지막글자),(첫글자+1글자,마지막글자-1) ....식으로 비교합니다.

2. 대문자와 소문자는 구별하지않기때문에 같다고알려줘야하는데 위의 비교식에서 이를 해결하려면 코드가 너무지저분해집니다.

3. 2번문제를 해결하기 위해 애초에 1번을 하기전에 입력한문자열을 통째로 대문자나 소문자로 통일시킵니다.

4. 비교연산중 한번이라도 짝이안맞으면 틀리므로 check변수로 참유무를 갱신합니다.

5. 3->1->4 순으로 해결합니다.


#include<iostream>
#include<string>
using namespace std;
int main()
{
	int n;
	cin >> n;
	cin.ignore();
	string s;
	for (int i = 0; i < n; i++)
	{
		getline(cin, s);
		bool check = true;
		for (int i = 0; i < s.size(); i++)
		{
			if (s[i] >= 'A' && s[i] <= 'Z')
				s[i] = s[i] - 'A' + 'a';
		}
		int len = s.size();
		for (int i = 0; i < len / 2; i++)
		{
			if (s[i] != s[len - i - 1])
			{
				check = false;
				break;
			}
		}
		if (check)
			cout << "Yes" << endl;
		else
			cout << "No" << endl;
	}
}


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

[백준 9226] 도깨비말  (0) 2019.12.06
[백준 1431] 시리얼 번호  (0) 2019.12.04
[백준 2703] Cryptoquote  (0) 2019.12.02
[백준 11536] 줄 세우기  (0) 2019.12.02
[백준2935]소음  (0) 2019.12.01

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


알고리즘은 다음과 같습니다.

1. 일단 입력값이 연산자를 제외하고 10의거듭제곱꼴 뿐이라 나올 수있는 출력값의 숫자는 0,1,2뿐입니다.

2. 입력값의 자릿수가 100을 넘기므로 int,long long 형으로 풀 수 없고 문자열로 접근합니다.

3. 입력값의 자릿수를 비교하며 연산합니다.

1) a와 b의 자릿수가 같을때

⑴: +연산: 2를 출력하고 a_size-1또는 b_size-1만큼 0을 출력합니다.

⑵ *연산: 1을출력하고 a_size+b_size -2만큼 0을 출력합니다.

2)a와 b의 자릿수가 다를때

⑴ +연산: a_size>b_size일때 : a[a_size-b_size]=1로바꾸고 a출력, 반대로 a_size<b_size일때는 b[b_size-a_size]=1로바꾸고 b출력

⑵ *연산: 1출력 후 a_size+b_size - 2만큼 0 출력


#include<iostream>
#include<string>
using namespace std;
int main()
{
	string a, b;
	char op;
	cin >> a >> op >> b;
	int a_size = a.size();
	int b_size = b.size();

	if (a_size == b_size)///사이즈같을때 
	{
		if (op == '+')
		{
			cout << 2;
			for (int i = 0; i < a_size - 1; i++)
				cout << 0;
		}
		else//'*'
		{
			cout << 1;
			for (int i = 0; i < a_size + b_size - 2; i++)
				cout << 0;
		}
	}
	else//사이즈다를때
	{
		if (op == '*')
		{
			cout << 1;
			for (int i = 0; i < a_size + b_size - 2; i++)
				cout << 0;
		}
		else//'+'
		{
			if (a_size < b_size) {
				b[b_size - a_size] = '1';
				cout << b;
			}
			else
			{
				a[a_size - b_size] = '1';
				cout << a;
			}

		}
	}
}






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

[백준 9226] 도깨비말  (0) 2019.12.06
[백준 1431] 시리얼 번호  (0) 2019.12.04
[백준 2703] Cryptoquote  (0) 2019.12.02
[백준 11536] 줄 세우기  (0) 2019.12.02
[백준10174] 팰린드롬  (0) 2019.12.02

+ Recent posts