728x90
https://www.acmicpc.net/problem/19948
이 문제.. 약 10번의 시도 끝에 겨우 풀었다.
C++를 이용한 답안 코드가 없길래 혹시 누군가 필요할까 싶어 글을 적게 되었다.
우선 문제를 꼼꼼히 읽자..!
자신과 똑같은 것이 다음에 오면 2번이 아니라 1번으로 친다는 것을 읽지못하고 좀 오래 헤매었다.
그리고, 주어진 키보드로 제목까지 입력할 수 있어야한다.
문제 풀이
- 우선 입력들을 다 받자
- 제목이 되는 문자들을 다 저장한다. 원하는 자료구조 사용해도 된다! 여기서 필자는 전부 소문자로 넣어줬는데, 이 이유는 밑에서 살펴볼 수 있다.
- 키보드 검사 로직을 구현한다. 어렵지 않은 문제라서 금방 구현할 수 있을 것이라 생각하지만, 혹시 어렵다면 주석을 달아놨으니 보시길 바란다.
- 해당 로직을 무사히 통과했으면 일단 내용까지는 키보드를 이용해서 입력할 수 있다는 뜻이다.
- 이제 제목을 검사하면서 출력해주자, 사용가능한 횟수가 1이상이라면 대문자로 변환하여 출력해주고 아니라면 -1을 출력하고 종료해주면 될 일이다.
※ 이 문제 풀 때, 내용 검사 한번하고 제목 검사 한번. 그러니까 총 2개의 반복문을(이중 for문 아님) 이용하여 구현하였는데, 왜인지 자꾸 틀렸다 ㅜㅜ
제목을 따로 벡터에 저장해주고, 검사를 하니 바로 통과함...
#include <iostream>
#include <vector>
#include<cctype>
#include<string>
using namespace std;
int space;
int alpha[26];
vector<char> ans;
int main() {
string str;
getline(cin, str);
cin >> space;
for (int i = 0; i < 26; i++) {
cin >> alpha[i];
}
ans.push_back(tolower(str[0])); // 제목 저장
for(int i=1; i<str.size();i++){
if(isalpha(str[i]) && str[i-1]==' '){
ans.push_back(tolower(str[i]));
}
}
for (int i = 0; i < str.size(); i++) {
if (str[i] == str[i+1]) continue; // 다음과 같으면 패스
if (str[i] == ' ') { // 공백이면
if (space <= 0) { // 남은 횟수가 0이하면
cout << -1; // 불가능
return 0;
}
else { // 0보다 크면
space--; // 하나 감소
}
}
else { // 알파벳일 경우
if (isupper(str[i])) { // 대문자면
str[i] = str[i] + 32; // 소문자로 바꿔서 저장
}
int tmp = str[i] - 97; // 인덱스로 변환 a = 97이니까 -97
if (alpha[tmp] <= 0) { // 0 이하면
cout << -1; // 불가능
return 0;
} else {
alpha[tmp]--; // 0보다 크면 사용가능한 횟수 하나 감소
}
}
}
// 제목 출력 및 검사
for(int i=0; i<ans.size();i++){
if(alpha[ans[i]-97] >=1) {
cout << char(toupper(ans[i]));
alpha[ans[i]-97]--;
}
else{
cout << -1;
return 0;
}
}
}
728x90
'알고리즘 > 백준(BOJ)' 카테고리의 다른 글
[백준/C++] 10830번 행렬 제곱 (0) | 2022.09.29 |
---|---|
[백준/C++] 1987번 알파벳 (0) | 2022.09.29 |
[백준/C++] 1406번 에디터 (0) | 2022.09.29 |
[백준/C++] 14465번 소가 길을 건너간 이유 5 (0) | 2022.09.28 |
[백준/C++] 2668번 숫자고르기 (0) | 2022.09.27 |