728x90

#include <iostream>
#include <algorithm>
#include <cmath>
#include <vector>
using namespace std;

int main(){
    ios::sync_with_stdio(false);
    cin.tie(NULL);
    int n, first = 0, second, third, fourth, temp;
    vector<pair<int, int>> vec;
    cin >> n;
    for (int i = 0; i < n; i++){
        cin >> temp;
        vec.push_back(make_pair(temp, 0));
        first += temp;
    }
    sort(vec.begin(), vec.end());

    first = round((double)first / (double)n);
    second = vec[n / 2].first;
    fourth = vec[n - 1].first - vec[0].first;

    if (vec.size() == 1) third = vec[0].first;
    else{
        //빈도수 계산
        for (int i = 0; i < n; i++){
            int idx = i;
            for (int j = i + 1; j < n; j++){
                if (vec[idx].first == vec[j].first){
                    vec[idx].second++;
                    i++;
                }
                else break;
            }
        }
        // 최빈값 중 최대값 찾기
        int max = vec[0].second;
        for (int i = 1; i < n; i++) if(vec[i].second > max) max = vec[i].second;

        // 최빈값이 0이라면 모든 수가 다르므로 2번째 값 반환
        if (max == 0) third = vec[1].first;
        else{
            vector<int> c;
            for (int i = 0; i < n; i++){
                if (vec[i].second == max)
                    c.push_back(vec[i].first);
            }
            if (c.size() == 1) third = c[0];
            else third = c[1];
        }
    }
    cout << first << "\n" << second << "\n" << third << "\n" << fourth;
}

빈도수 계산하는 방법-> 정렬이 된 상태이기 때문에 이렇게 생각해서 풀 수 있다.

계속 문제를 틀렸는데 그 이유가 빈도수 계산시 값이 같으면 i값을 증가시켰다. 그랬더니 if문에 vec[i]도 증가시켜서 문제였다. 그래서 if문에 vec[i]값을 고정시켰다.

 

반응형
728x90

#include <iostream>
#include <stack>
using namespace std;

int main(){
    string s;
    while(true){
        getline(cin, s);
        if(s == ".") break;
        stack<char> st;
        bool check = true;
        for(char c: s){
            if( c == '(' || c == '[' ) st.push(c);
            else if( c == ')'){
                if( !st.empty() && st.top() == '('){
                    st.pop();
                }
                else{
                    check = false;
                    break;
                }
            } else if( c == ']'){
                if( !st.empty() && st.top() == '['){
                    st.pop();
                }
                else{
                    check = false;
                    break;
                }
            }
        }
        if(check && st.empty()) cout << "yes\n";
        else cout << "no\n";
    }
}

( [ 인 경우 stack에 넣고, ) ] 경우 top이 ( [ 인지 확인한다.
만약 ) ] 경우 stack이 비어있거나 ( [ 아닌 경우 bool을 false로 바꾼다.
bool을 생각 못해서 시간이 오래걸렸던 문제다. ㅜㅜ.

반응형
728x90

STL Stack을 이용하여 구현한다.
중위 표기를 후위 표기를 바꾸기 위해서 해야하는 행동
1. ( 은 스택에 넣는다.
2. )은 ( 가 나올 때까지 Stack을 비운다.
3. + - * / 는 Stack이 비어있는지 확인한다.
3-1 Stack이 비어있지 않는 경우 현재 연산자와 Stack top에 있는 연산자를 비교한다.
3-1-1 top 연산자가 우선 순위가 높은 경우 출력하고 다음 top도 3-1 행동을 반복한다.
4. 현재 연산자를 stack에 넣어준다.


#include <iostream>
#include <stack>
using namespace std;

int priority(char c) {
    switch (c){
        case '(': case ')': return 0;
        case '+': case '-': return 1;
        case '*': case '/': return 2;
    }
    return -1;
}

int main(){
    ios_base::sync_with_stdio(0);
    cin.tie(0);
    string s;
    cin >> s;
    stack<char> st;
    for(char c: s){
        if( c >= 'A' && c <= 'Z' ) cout << c;
        else if( c == '(' ) st.push(c);
        else if( c == ')'){
             while(!st.empty()){
                char op = st.top();
                st.pop();
                if( op == '(' ) break;
                else cout << op;
            }
        } else {
            while(!st.empty()){
                char op = st.top();
                if( priority(c) <= priority(op)){
                    st.pop();
                    cout << op;
                } else break;
            }
            st.push(c);
        } 
    }
    while(!st.empty()){
        cout << st.top();
        st.pop();
    }
}

먼저 배열을 사용하여 구현하는 것이 훨씬 빠르다. 현 문제는 길이가 100이 넘지 않아서 배열사이즈을 100으로만 설정해줘도 크게 문제 없고 Vector로 구현하는 것보다 빠르다.

배열로 Stack을 구현해서 문제를 풀어도 되지만 귀찮으니까 STL Stack을 이용한다.

위 문제는 시간 0 ms가 걸리면서 끝난다.

하지만 위 코드상

            while(!st.empty()){
                char op = st.top();
                if( priority(c) <= priority(op)){
                    st.pop();
                    cout << op;
                } else break;
            }

이런 부분에서 st.top() 함수를 자주 사용하여 비교하거나 출력할 때 사용했더니 시간 초과가 나서 이번 기회로 함수 호출을 자주하면 안되겠다는 생각을 하게 되었습니다.

반응형
728x90

문제 자체는 매우 쉬운 난이도


보통 문제를 처음 접하는 사람은 A>=B && B>=C 라면 B 이런 식으로 하나 씩 해서 풀었을 텐데

그냥 한번 정렬해주고 가운데 숫자 뽑아가주면 두번째로 큰 숫자를 찾을 수 있다.


목적은 두번째로 큰 숫자 찾는 거니까... 함수 써도 되겠지 ? 너무 얍삽한건가 주륵..



A, B, C = map(int, input().split())
list_A = [A, B, C]
# 정렬하고 가운데 뽑아가라 그냥
list_A.sort()

print(list_A[1])

반응형

'코딩 관련 > c++' 카테고리의 다른 글

백준 1966 프로그래머스 Level 2 프린터 큐 Java c++  (0) 2020.04.24
백준 수 정렬하기3  (0) 2020.04.24
백준 2108번 통계학  (0) 2020.04.24
백준 4949 균형잡힌 세상  (0) 2020.04.23
백준 1918 후위 표기식  (0) 2020.04.21

+ Recent posts