https://www.acmicpc.net/problem/2954
굉장히 간단한 문제인데 조금 더 생각을 하지 못하고 문제의 조건 곧이 곧대로 푸느라 효율적이지 못했던 것 같다....
아이디어의 흐름
1. 아이디어 구상
모음이 온 다음에는 무조껀 'p + 모음' 이 삽입되는 것이므로, 입력받은 문자열을 처음부터 끝까지 순회하며 모음인 a e i o u를 만나게 되면 앞으로 올 두 원소를 삭제해주는 방향으로 생각하였다. 문자열 입력은 getlin()으로 받은 후 원소를 삭제할 때 원소 삭제 후 한 칸 당겨지도록 하기 위해, 입력받은 문자열을 다시 vector에 저장하여 erase() 함수를 사용하였다.
- getline()을 통해 문자열 받은 후, vector에 넣어주기
- vector의 원소를 iterator를 통해 순회하며 현재 위치의 원소가 a e i o u라면, 그 다음 두 개의 원소를 erase로 삭제
- 삭제가 완료된 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 내장함수에 대해서 조금 더 자세히 알 필요가 있을 것 같다.
또한 알고리즘 문제에 한해서 굳이 문제에서 요구하지 않은 작업을 할 필요는 없다는 것을 꼭 기억해야할 것 같다. 문제에서 원래의 문자열을 요구하긴 했지만, 꼭 삽입된 문자를 삭제하지 않아도 원래의 문자열을 구할 수 있었을텐데 바로 생각하지 못한 것이 아쉽다..
'알고리즘 > 문제' 카테고리의 다른 글
[백준 BOJ] 1260 : DFS와 BFS(C++) (0) | 2021.08.10 |
---|---|
[백준 BOJ] 6588 : 골드바흐의 추측(C++) (0) | 2021.08.05 |
[백준 BOJ] 2579 : 계단 오르기 (C++) (0) | 2021.07.28 |
[백준 BOJ] 1149 : RGB거리 (C++) (0) | 2021.07.20 |
[백준 BOJ] 11497번 : 통나무 건너뛰기 (C++) (0) | 2021.07.11 |
댓글