본문 바로가기
알고리즘/문제

[백준 BOJ] 2954 : 창영이의 일기장 (C++)

by domo7304 2021. 7. 13.

https://www.acmicpc.net/problem/2954

 

2954번: 창영이의 일기장

창영이는 매일 밤 하루동안 일어난 일을 일기장에 남긴다. 일기장을 쓰면서 영어 공부도 같이 하기 위해서 영어로 일기를 쓴다. 또, 남들이 자신의 일기장을 보는 것을 막기 위해서 모음('a','e','i

www.acmicpc.net

굉장히 간단한 문제인데 조금 더 생각을 하지 못하고 문제의 조건 곧이 곧대로 푸느라 효율적이지 못했던 것 같다....

아이디어의 흐름

1. 아이디어 구상

모음이 온 다음에는 무조껀 'p + 모음' 이 삽입되는 것이므로, 입력받은 문자열을 처음부터 끝까지 순회하며 모음인 a e i o u를 만나게 되면 앞으로 올 두 원소를 삭제해주는 방향으로 생각하였다. 문자열 입력은 getlin()으로 받은 후 원소를 삭제할 때 원소 삭제 후 한 칸 당겨지도록 하기 위해, 입력받은 문자열을 다시 vector에 저장하여 erase() 함수를 사용하였다.

  1. getline()을 통해 문자열 받은 후, vector에 넣어주기
  2. vector의 원소를 iterator를 통해 순회하며 현재 위치의 원소가 a e i o u라면, 그 다음 두 개의 원소를 erase로 삭제
  3. 삭제가 완료된 vector 출력

2. 코드

#include <iostream>
#include <string>
#include <vector>
using namespace std;

int main() {
	string str;
	getline(cin, str);
	int length = str.length();

	vector <string> s(length);

	for (int i = 0; i < str.length(); i++) s[i] = str[i];

	auto iter = s.begin();
	while (iter < s.end()) {
		if (*iter == "a" || *iter == "e" || *iter == "i" || *iter == "o" || *iter == "u") {
			iter++;
			iter = s.erase(iter);
			iter = s.erase(iter);
		}
		else iter++;
	}
	for (int i = 0; i < s.size(); i++) cout << s[i];
	cout << '\n';
}

1-1. 초기 아이디어의 한계

문제는 맞았지만 뭔가 더 간단해질 수 있을 것 같다는 생각이 들었고, '맞은 사람' 탭을 통해 코드를 참고하여 다시 작성하였다.

'모음을 만나면 p + 모음을 삽입한다고 했으니, 다시 원래대로 돌리려면 이를 삭제해줘야겠지' 와 같이 생각할 수도 있지만 너무 곧이 곧대로만 생각했던 것 같다....'결과적으로 원래의 텍스트만 출력하면 되는 것이니 입력받은 문자열에서 모음을 만날 때마다 두 칸 건너뛰면 되겠네' 라고 생각할 수도 있을텐데 이를 생각하지 못했다.

2-1. 코드

#include <iostream>
#include <string>
using namespace std;

int main() {
	string str;
	getline(cin, str);

	for (int i = 0; i < str.length(); i++) {
		cout << str[i];
		
		if (str[i] == 'a' || str[i] == 'e' || str[i] == 'i' || str[i] == 'o' || str[i] == 'u') 
        i += 2;
	}
}

5. 아쉬운점

  • 총 소요시간 : 30분
  • 아이디어 구상 : 5분
  • 구현 : 25분

조금 부끄럽지만 첫 번째 코드에서 s.erase(iter) 후 return 된 iterator를 다시 받아주어야 하는데, 이를 생각하지 못하고 자꾸 오류가 떠서 '잘못된 곳이 없는데 어디가 문제지..' 해맸다. 혹시나 싶어서 레퍼런스 사이트에 vector::erase 검색해보고 맞았다...C++ 을 사용할 거면 STL 내장함수에 대해서 조금 더 자세히 알 필요가 있을 것 같다.

또한 알고리즘 문제에 한해서 굳이 문제에서 요구하지 않은 작업을 할 필요는 없다는 것을 꼭 기억해야할 것 같다. 문제에서 원래의 문자열을 요구하긴 했지만, 꼭 삽입된 문자를 삭제하지 않아도 원래의 문자열을 구할 수 있었을텐데 바로 생각하지 못한 것이 아쉽다..

댓글