문제출처: 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; }
결과
'문제풀이(BOJ) > 문자열' 카테고리의 다른 글
[백준 2535] 아시아 정보올림피아드(클래스 연습) (0) | 2020.01.06 |
---|---|
[백준 1075] 나누기(string연습!!) (0) | 2020.01.06 |
[백준 9226] 도깨비말 (0) | 2019.12.06 |
[백준 1431] 시리얼 번호 (0) | 2019.12.04 |
[백준 2703] Cryptoquote (0) | 2019.12.02 |