#1715. 카드 정렬하기

sese·2022년 11월 3일
0

백준

목록 보기
4/8

n개의 수를 우선순위 큐에 삽입한다. 가장 작은 수 두개를 꺼내서 더하고, 우선순위 큐에 값이 남아있다면, 더한 수를 다시 우선순위 큐에 삽입한다.

c++ (런타임 에러 - Segfault)

int main() {
    
    priority_queue<int> pq;
    
    int n, sum=0;
    cin >> n;
    
    while(n--) {
        int num;
        cin >> num;
        pq.push(-num);
    }
    
    // 에러 이유
    // 입력 값이 하나만 들어왔을 때 
    // pq.size()가 1인 상태에서 코드가 실행되어서 에러가 난다.
    while(1) {
        
        int tmp = 0;
        
        // sum과 tmp에 가장 작은 수 두 개를 더하고
        // 그 수를 제거한다
        for (int i=0; i<2; i++) {
            sum += -pq.top();
            tmp += -pq.top();
            pq.pop();
        }
        
        // 만약 우선순위 큐의 길이가 0이면 반복문을 나온다
        // 아니라면 위에서 두 수를 더한 값을 우선순위 큐에 넣어준다
        if (pq.size() == 0) {
            break;
        } else {
            pq.push(-tmp);
        }
    }
    
    cout << sum;
}

c++

int main() {
    
    priority_queue<int> pq;
    
    int n, sum=0;
    cin >> n;
    
    while(n--) {
        int num;
        cin >> num;
        pq.push(-num);
    }
    
    // 우선순위 큐의 길이가 1보다 크면
    while(pq.size() > 1) {
        
        // 가장 작은 수 두 개를 n1, n2에 저장하고, 우선순위 큐에서 제거한다
        int n1 = -pq.top();
        pq.pop();
        int n2 = -pq.top();
        pq.pop();
        
        // sum에 두 수를 더해준다
        sum += n1 + n2;
        // 우선순위 큐에 두 수를 더한 값을 추가한다
        pq.push(-(n1 + n2));
    }
    
    cout << sum;
}
profile
예전 글은 다크모드로 봐야 잘 보일 수도 있습니다.

0개의 댓글