[백준] 2751번 : 수 정렬하기 2 (C++) + 시간초과 & 런타임 에러(OutofBounds) 해결

2024. 2. 21. 02:18·Programming/C++ - 백준
반응형

 


문제


풀이

첫 번째 코드 - 실패 

 ➡ 시간복잡도: O(n2), int 배열 사용

  

// O(n^2), 시간초과 & 배열의 크기가 커 오류 발생

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

int main() {
	int N, num, temp;		
	int arr[1000001];

	cin >> N;

	for (int i = 0; i < N; i++) {
		cin >> num;
		arr[i] = num;
	}

	for (int i = 0; i <= N - 2 ; i++) {
		for (int j = i + 1; j <= N - 1; j++) {
			if (arr[i] > arr[j]) {
				temp = arr[i];
				arr[i] = arr[j];
				arr[j] = temp;
			}
		}
	}

	for (int i = 0; i < N; i++) {
		cout << arr[i] << "\n";
	}

	return 0;
}

 

 

배열을 이용해 입력된 숫자를 저장하고, 오름차순으로 정렬하는 코드를 만들었다.

하지만, 시간 초과 및 입력값이 많아 배열의 범위를 넘어서 런타임 에러(OutofBounds)가 발생했다.

 

 

1. 시간 초과 이유: 이중 for문을 사용하여, O(n2)의 시간복잡도를 갖는다. 따라서, 시간이 너무 오래 걸린다.

 

  • Insertion, Bubble, Selection Sort의 평균 시간 복잡도 = O(n2)
  • Quick, Merge, Heap Sort의 평균 시간 복잡도 = O(nlogn)

 

따라서, 두 번째 풀이에는 C++에 내장된 sort 함수를 이용하였다. Quick Sort 기반이기 때문에 최악의 경우 O(n2)가 아니라면, O(nlogn)의 시간복잡도가 나올 것이다. sort()는 C++의 algorithm 헤더에 포함되어 있다.

 

 

2. 런타임 에러 이유: 입력되는 N의 값이 최대 1,000,000개이다. int array의 최대 크기는 약 250,000이기 때문에, 배열의 범위를 넘어서 OutofBounds 에러가 발생한다.

 

  • int 배열의 최대 크기 =  약 250,000 (이십오만)
  • vector의 최대 크기 = 약 100,000,000 (1억)

추가로, array를 사용하기 위해서는 원소의 개수를 지정해야한다.

vector는 원소의 개수를 지정하지 않더라도, 선언할 수 있다.

 

따라서, 두 번째 풀이에는 vector를 이용하였다. vector의 범위를 입력값이 넘어서지 않기 때문에, 런타임 에러가 발생하지 않는다. vector를 사용하기 위해서는 C++의 vector 헤더를 사용해야 한다.

 

더하여, endl이 아닌 \n을 사용하였다.

endl은 출력 스트림에 사용되는 버퍼를 매번 비우므로(buffer flush) 시간이 오래 걸린다. 따라서, \n을 사용하면 시간을 단축시킬 수 있다.


두 번째 코드 - 성공  

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

int main() {
	int N, num;
	vector<int> v;

	cin >> N;

	for (int i = 0; i < N; i++) {
		cin >> num;
		v.push_back(num);
	}

	sort(v.begin(), v.end());

	for (int i = 0; i < N; i++) {
		cout << v[i] << "\n";
	}

	return 0;
}

결과

 

반응형
저작자표시 (새창열림)

'Programming > C++ - 백준' 카테고리의 다른 글

[백준] 7568번 : 덩치 (C++) + pair 클래스  (0) 2024.03.03
[백준] 1978번 : 소수 찾기 (C++)  (1) 2024.02.21
[백준] 10250번 : ACM 호텔 (C++) + 반례 및 그림 설명  (2) 2024.02.20
[백준] 27866번 : 문자와 문자열 (C++)  (0) 2024.02.20
[백준] 2839번 : 설탕 배달- Greedy Algorithm (C++)  (3) 2023.05.25
'Programming/C++ - 백준' 카테고리의 다른 글
  • [백준] 7568번 : 덩치 (C++) + pair 클래스
  • [백준] 1978번 : 소수 찾기 (C++)
  • [백준] 10250번 : ACM 호텔 (C++) + 반례 및 그림 설명
  • [백준] 27866번 : 문자와 문자열 (C++)
지구코드
지구코드
IT를 공부하고 있는 지구의 코딩공간입니다!
  • 지구코드
    지구의 코딩공간
    지구코드
  • 전체
    오늘
    어제
    • 분류 전체보기
      • 개발 기록
      • Back-end
        • Spring
        • Django
      • Programming
        • 알고리즘
        • C++ - 백준
      • Cloud
  • 블로그 메뉴

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

  • 공지사항

  • 인기 글

  • 태그

    백준
    큐
    KDT교육
    EC2
    binary_search
    Cloud
    k디지털트레이닝
    dp
    부분 문자열 추출
    시간초과
    AWS
    프디아
    C++
    이진탐색
    pair 클래스
    별 찍기
    정렬
    awscloudclubs
    프로디지털아카데미
    edgelocation
    알파코
    시간복잡도
    피보나치 수
    부트캠프
    신한투자증권
    구조체 벡터
    알파코캠퍼스
    다이내믹 프로그래밍
    fill 함수
    슬라이딩윈도우
  • 최근 댓글

  • 최근 글

  • 반응형
  • hELLO· Designed By정상우.v4.10.3
지구코드
[백준] 2751번 : 수 정렬하기 2 (C++) + 시간초과 & 런타임 에러(OutofBounds) 해결
상단으로

티스토리툴바