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


문제

꿍은 만사가 귀찮아서 말을 하기도 귀찮아 한다. 그래서 하려는 말을 대신해줄 줄임말을 만들려고 하는데 나름 규칙을 만들었다.

하려는 말은 최소 하나 이상의 단어를 포함하는데 각 단어들은 정확히 한칸의 공백으로 구분이 된다. 줄임말을 만들때는 각 단어의 앞글자를 따서 만들어지는데 다음의 단어들은 쓸모없는 단어들이므로 무시한다.

'i', 'pa', 'te', 'ni', 'niti', 'a', 'ali', 'nego', 'no', 'ili'.

하지만 이 단어들이 하려는 말의 맨 앞에 올경우 매우 중요하다고 판단되어 무시하면 안되고 줄임말에 포함하여야 한다.

줄임말을 만들기도 귀찮아진 꿍을 위해 줄임말을 만들어주는 프로그램을 작성하라.

단, 줄임말은 모두 대문자로만 이루어져있다. 


입력

입력은 유일하게 한 줄만 주어지며 하려는 말이 포함되어 있다.

문장은 알파벳 소문자와 공백으로만 이루어져 있다.

문장의 최대길이는 100이다.


출력

만들어진 줄임말을 출력하라.


풀이

vector는 동적배열, vector가 담은 내부 요소는 정적배열로 이루어져있다는 것을 알면 vector,string으로 풀 수 있습니다. 아래 소스코드에서도 어느정도 알 수 있지만 vector<string>v 에서 v[0][0]은 0번째 벡터의, 0번째 벡터가담은 <string>의 첫번째 요소를 나타냅니다. 예를들어 0번째 벡터v에 abc가 담겨있다면 v[0][2]는 c가 되겠죠? 즉,2차원배열처럼 사용한다고 생각하면 이해가 쉽습니다. (백준사이트에 사용법을 문의해봤습니다.) 

문제로 돌아가서, 벡터에 따옴표로 구분되는 문자열을 삽입하기위해 임시변수temp로 문자열을 넣어줍니다. 그리고 소스코드에도 나와있듯이 null문자를만나기전의 마지막 문자열을 삽입해야하므로 22행을 꼭 실행해야합니다. 그러고나서 첫번째 글자를 출력하고 그다음부터는(2번째문자부터) 조건에맞게 출력하면됩니다.


코드

#include<iostream>
#include<vector>
#include<string>
using namespace std;
int main()
{
	string word;
	getline(cin, word);
	string temp;
	vector<string>v;
	for (int i = 0; i < word.size(); i++)
	{
		if (word[i] == ' ')
		{
			v.push_back(temp);
			temp = "";
		}
		else
			temp += word[i];
	}
	//마지막 null전까지의 단어까지넣고,
	v.push_back(temp);
	//최소하나의단어를포함하므로 첫글자출력
	cout << char(v[0][0]-'a'+'A');
	for (int i = 1; i < v.size(); i++)
	{
		if (v[i] != "i" && v[i] != "pa" && v[i] != "te" && v[i] != "ni" && v[i] != "niti" && v[i] != "a" && v[i] != "ali" && v[i] != "nego" && v[i] != "no" && v[i] != "ili")
			cout << char(v[i][0] - 'a' + 'A');
	}
	cout << endl;
	
}


결과

+ Recent posts