728x90
https://www.acmicpc.net/problem/3613
Priority Queue에 스트링을 넣으면 어떻게 되는가
넣어봤다 default로 내림차순이다(제일 큰 수가 root)
#include <iostream>
#include <queue>
using namespace std;
priority_queue<char> pq;
int main() {
string var;
cin >> var;
for (int i = 0; i < var.length(); i++) {
pq.push(var[i]);
}
while (!pq.empty()) {
cout << pq.top() << "\n";
pq.pop();
}
}
//input
a_A_bBddCDDfG
//output
f
d
d
b
a
_
_
G
D
D
C
B
A
error의 경우에는 어떤 경우가 있나?
- 소문자로 시작하지 않는 것
- _과 대문자가 같이 쓰인것
- _로 끝남
- _가 2개이상 이어짐
Java
- 소문자만 사용됨
- 소문자와 대문자 혼용
C++
- 소문자만 사용됨
- 소문자와 _ 혼용
음 그럼 위의 결과를 참고해서
순서대로 pop했는데,
소문자만 나오고 끝남 -> 둘다 가능
소문자가 끝나고 _가 튀어나오다가 끝남 -> C++
소문자가 끝나고 _가 튀어나오다가 대문자가 튀어나옴 -> Error
소문자가 끝나고 대문자가 튀어나옴 -> Java
흠 정리해보면,
소문자
소문자 나오다가 -> 1. _가 나옴 / 2. 대문자가 나옴 / 3._다음에 대문자가 나옴
/**
*
* Naming JAVA
* 1. start with small letter
* 2. Separate with Big letter
*
* Naming C++
* 1. only small letter
* 2. Separate with _
*
*
*/
#include <iostream>
#include <queue>
using namespace std;
priority_queue<char> pq;
queue<char> q;
// -1 : error
int decideLan() {
int flag = 3; // 1: c++ 2:java 3:both -1:error
while (!pq.empty()) {
char c = pq.top();
pq.pop();
if (islower(c)) continue; //소문자면 무시
if (c == '_') {
flag = 1; // _가 등장하면 일단 c++임}
}
if (isupper(c)) {
//대문자가 나왔는데
//1. 이전이 _였음
if (flag == 1) {
return -1;
}
return 2; //2. _이 아닌경우 _나 소문자가 나올일이 없음 즉, java일 확률뿐
}
}
return flag; // 소문자만 나오다 끝났으면 3, _만났으면 1
}
string cvtToJava() { // c to J
string ans = "";
bool flag = false;
while (!q.empty()) {
char c = q.front();
q.pop();
if (flag == true && c == '_') return "Error!"; //_이 2개이상 반복
if (c == '_') {
flag = true;
continue;
}
if (flag == true) {
ans.push_back(toupper(c)); //대문자로 바꿔서 삽입
flag = false;
} else {
ans.push_back(c);
}
}
return ans;
}
string cvtToC() {
string ans = "";
while (!q.empty()) {
char c = q.front();
q.pop();
if (islower(c)) {
ans.push_back(c);
continue;
}
ans.push_back('_');
ans.push_back(tolower(c)); //대문자로 바꿔서 삽입
}
return ans;
}
int main() {
string var;
cin >> var;
for (int i = 0; i < var.length(); i++) {
pq.push(var[i]);
q.push(var[i]);
}
if (!islower(var[0])) { //소문자 시작이 아님
cout << "Error!" << "\n";
} else if (var[var.length() - 1] == '_') { // _로 끝남
cout << "Error!" << "\n";
} else {
int lan = decideLan();
switch (lan) {
case 1://c++임
cout << cvtToJava() << "\n";
break;
case 2://java임
cout << cvtToC() << "\n";
break;
case 3: //변경이 필요없음
cout << var << "\n";
break;
case -1:
cout << "Error!" << "\n";
break;
default:
break;
}
}
}
728x90
'Algorithm > BaekJoon' 카테고리의 다른 글
[11723] 집합 (0) | 2021.09.23 |
---|---|
[11000] 강의실 배정 (0) | 2021.09.23 |
[2869] 달팽이는 올라가고 싶다 (0) | 2021.08.29 |
[1193] 분수찾기 (0) | 2021.08.28 |
[2292] 벌집 (0) | 2021.08.28 |