[백준 1744 C++]수 묶기 풀이, vector 런타임 에러 해결

2026. 2. 16. 19:17·백준

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

 

1은 더했을 때 최대이니 1은 따로 빼서 sum,

양수/음수를 나눠 곱해주고 홀수라면 남은 하나는 더하기. 처음에는 arr을 사용했는데 굳이 배열을 쓰지 않아도 가능

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

int main(){
    int N;
    cin >> N;
    long long plus[51], minus[51], arr[51]; 
    for(int i=0; i<N; i++){
        cin >> arr[i];
    }

    sort(arr, arr+N);
    long long sum = 0;
    int p = 0, m = 0;
    // 양수, 1, 음수 분리
    for(int i=0; i<N; i++){
        if(arr[i] > 1){
            plus[p++] = arr[i];
        }else if (arr[i] == 1){
            sum += 1;
        }else{
            minus[m++] = arr[i];
        }
    }
    // 양수 큰 수부터 곱하기
    for(int i=p-1; i>=1; i-=2){
        sum += plus[i] * plus[i-1];
    }
    if(p % 2 == 1){
        sum += plus[0];
    }
    // 음수 작은 수부터 곱하기
    for(int i=0; i<m-1; i+=2){
        sum += minus[i] * minus[i+1];
    }
    if(m % 2 == 1){
        sum += minus[m-1];
    }
    cout << sum;
}

 

vector 사용해서도 해봤는데 런타임 에러가 계속 나서 보니 언더플로우 문제가 있었다!!!!!!!!! 배운 걸 다 까먹은듯

 
for(int i=0; i<p.size()-1; i+=2) 

p.size()가 0일 때 p.size()는 size_t (unsigned)이므로 
0 - 1 하면 음수가 아니라 → 1844674407... 같은 큰 양수가 됨
이렇게 되면 i < p.size()-1 이 항상 true가 되어 루프 돎!!!

조건을 for(int i = 0; i + 1 < p.size(); i += 2) 로 바꿔주자.

 

올바른 vector 코드

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

int main(){
    ios::sync_with_stdio(0); cin.tie(0);

    int N; cin >> N;
    vector<int> p, m;
    int sum = 0;
    for(int i=0; i<N; i++){
        int x; cin >> x;
        if(x > 1) p.push_back(x);
        else if(x == 1) sum += 1; 
        else m.push_back(x);
    }

    sort(p.begin(), p.end(), greater<>()); // 양수는 내림차순
    sort(m.begin(), m.end()); // 음수는 오름차순

    if(p.size() % 2 == 1) sum += p.back();
    for(int i = 0; i + 1 < p.size(); i += 2){
    sum += p[i] * p[i+1];
    }

    if(m.size() % 2 == 1) sum += m.back();
    for(int i = 0; i + 1 < m.size(); i += 2){
    sum += m[i] * m[i+1];
    }
    
    cout << sum;
    return 0;
}
저작자표시 비영리 변경금지 (새창열림)

'백준' 카테고리의 다른 글

[백준 1751 C++] 카드 정렬하기 풀이(그리디, 우선순위 큐)  (0) 2026.02.16
[백준 2751 c++] 수 정렬하기 2 런타임 에러, 시간초과 해결  (0) 2026.01.03
[백준 2839번 C++] 설탕 배달  (0) 2025.05.07
[백준 1874번 C++] 스택 수열  (0) 2025.05.06
'백준' 카테고리의 다른 글
  • [백준 1751 C++] 카드 정렬하기 풀이(그리디, 우선순위 큐)
  • [백준 2751 c++] 수 정렬하기 2 런타임 에러, 시간초과 해결
  • [백준 2839번 C++] 설탕 배달
  • [백준 1874번 C++] 스택 수열
데구르르..
데구르르..
내가 보려고 기록하는
  • 데구르르..
    데굴데굴
    데구르르..
  • 전체
    오늘
    어제
    • 분류 전체보기 (27)
      • CS STUDY (5)
        • DB (8)
      • 프로그래머스 (5)
      • 백준 (5)
      • PROJECT (2)
      • ETC (1)
      • 회고 (1)
  • 블로그 메뉴

    • 홈
    • 태그
    • 방명록
  • 링크

  • 공지사항

  • 인기 글

  • 태그

    SQL기초
    백준
    데이터베이스정리
    그리디 알고리즘
    외래키
    데이터베이스설계
    ossca
    redis
    관계형데이터베이스
    Valkey
  • 최근 댓글

  • 최근 글

  • hELLO· Designed By정상우.v4.10.6
데구르르..
[백준 1744 C++]수 묶기 풀이, vector 런타임 에러 해결
상단으로

티스토리툴바