https://www.acmicpc.net/problem/1283
몸풀기로 실버 문제를 한 문제 더 풀었다.
문자열, 구현 문제다.
분명 어려워 보이지는 않는데 C++ 문자열은 split도 안되고 문자열 전체의 대소 변경도 안되는 관계로 조금 까다로웠다.
우선 입력 받는 문자열에 공백이 포함되므로 getline을 이용해서 입력을 받는다.
(getline은 쓸 때마다 헷갈려서 찾아봤는데 이번 학기에 타 과 C++ 수업 또 들으면서 확실히 익숙해졌다.)
다른 언어들이면 split을 이용해서 공백으로 구분을 했을텐데 C++은 그런게 존재하지 않기에 반복문을 돌렸다.
1. 첫 글자가 단축키로 지정되었는지 확인
2. 이전 글자가 공백인 글자가 단축키로 지정되었는지 순차적으로 확인
3. 별다른 조건 없이 옵션에 포함된 글자들을 순차적으로 단축키로 지정되었는지 확인한다.
이 때 발생했던 두 가지 문제가 있다.
1. 대소문자 구분
문제에서는 대소문자를 구분하지 않는다고 했다.
그래서 모든 문자를 소문자로 통일했더니 출력할 때는 원상태로 돌려놔야 했다.
따라서 원본 문자열을 저장해놔야 했다.
2. 공백을 단축키로 지정
위 3번 과정에서 조건 없이 확인을 했다고 했는데, 이 때 공백을 단축키로 지정해버리는 경우가 발생했다.
따라서 조건에 공백이 아님을 추가해줬다.
#include <iostream>
#include <string>
#include <vector>
using namespace std;
int n;
bool alpha[26];
string s;
int main() {
cin >> n;
cin.ignore();
while (n--) {
getline(cin, s);
string origin = s;
int size = s.size();
for (int i = 0; i < size; i++)
s[i] = tolower(s[i]);
if (s[0] != ' ' && !alpha[s[0] - 'a']) {
cout << "[" << origin[0] << "]" << origin.substr(1, size - 1) << "\n";
alpha[s[0] - 'a'] = 1;
continue;
}
bool check = 0;
for (int i = 1; i < size; i++) {
if (s[i] != ' ' && s[i - 1] == ' ' && !alpha[s[i] - 'a']) {
cout << origin.substr(0, i) << "[" << origin[i] << "]" << origin.substr(i + 1, size - i - 1) << "\n";
alpha[s[i] - 'a'] = 1;
check = true;
break;
}
}
if (check) continue;
for (int i = 1; i < size; i++) {
if (s[i] != ' '&& !alpha[s[i] - 'a']) {
cout << origin.substr(0, i) << "[" << origin[i] << "]" << origin.substr(i + 1, size - i - 1) << "\n";
alpha[s[i] - 'a'] = 1;
check = true;
break;
}
}
if (check) continue;
cout << origin << "\n";
}
}
'Algorithm > Implementation' 카테고리의 다른 글
[C++] BOJ(백준) 17822 원판 돌리기 (0) | 2024.06.22 |
---|---|
[C++] BOJ(백준) 1138 한 줄로 서기 (0) | 2024.06.22 |
[C++] BOJ(백준) 14891 톱니바퀴 (1) | 2024.02.14 |
[C++] BOJ(백준) 23031 으어어… 에이쁠 주세요.. (1) | 2024.02.13 |
[C++] BOJ(백준) 4920 테트리스 게임 (1) | 2024.02.09 |