본문 바로가기

Algorithm/BaekJoon

[3613] Java vs C++ - Priority Queue에 string넣으면

728x90

 

 

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

 

3613번: Java vs C++

Java 예찬론자 김동규와 C++ 옹호가 김동혁은 서로 어떤 프로그래밍 언어가 최고인지 몇 시간동안 토론을 하곤 했다. 동규는 Java가 명확하고 에러가 적은 프로그램을 만든다고 주장했고, 동혁이는

www.acmicpc.net

 

 

 

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