no image
[C++] 백준 13단계 - 11650번 문제 (좌표 정렬하기)
문제설명 소스코드 #include #include using namespace std; class XY { public: int x; int y; bool operator x x == arr.x) && (this->y > N; XY* arr = new XY[N]; for (int i = 0; i < N; ++i) cin ..
2023.07.18
no image
[C++] 백준 10867번 문제 (중복 빼고 정렬하기)
문제설명 소스코드 #include #include #include using namespace std; int main() { int N; vector arr; cin >> N; int input; for (int i = 0; i > input; arr.push_back(input); } sort(arr.begin(), arr.end()); arr.erase(unique(arr.begin(), arr.end()), arr.end()); for (int i = 0; i < arr.size(); ++i) cout 중복된 원소의 첫 번째 부터 벡터의 마지막까지를 지워버림
2023.07.17
no image
[C++] 백준 13단계 - 1427번 문제 (소트인사이드)
문제설명 소스코드 #include #include using namespace std; bool compare(int a, int b) { return a > b; } int main() { string N; cin >> N; sort(N.begin(), N.end(),compare); cout
2023.07.16
no image
[C++] 백준 13단계 - 10989번 문제 (커트라인)
문제설명 소스코드 #include #include using namespace std; bool compare(int a, int b) { return a > b; } int main() { int N, k; cin >> N >> k; int* arr = new int[N]; for (int i = 0; i > arr[i]; sort(arr, arr + N, compare); cout
2023.07.15
no image
[C++] 백준 13단계 - 2587번 문제 (대표값2)
문제설명 소스코드 #include #include using namespace std; int main() { int arr[5]; int sum = 0; for (int i = 0; i > arr[i]; sum += arr[i]; } sort(arr, arr + 5); cout
2023.07.14
no image
[C++] 백준 13단계 - 10989번 문제 (수 정렬하기 3)
문제설명 소스코드 #include using namespace std; int main() { ios_base::sync_with_stdio(false); //표준 스트림 동기화 해제 cin.tie(NULL); //입력과 출력 연결 끊기 int N; cin >> N; int arr[10001] = { 0 }; for (int i = 0; i > idx; arr[idx] += 1; } for (int i = 1; i < 10001; ++i) { for (int j = 0; j < arr[i]; ++j) cout
2023.07.14
no image
[C++] 백준 13단계 - 2751번 문제 (수 정렬하기 2)
문제설명 소스코드 #include #include using namespace std; int main() { ios_base::sync_with_stdio(false); //표준 스트림 동기화 해제 cin.tie(NULL); //입력과 출력 연결 끊기 int N; cin >> N; int* arr = new int[N]; for (int i = 0; i > arr[i]; sort(arr, arr+N); for (int i = 0; i < N; ++i)cout
2023.07.13
no image
[C++] 백준 13단계 - 2750번 문제 (수 정렬하기)
문제설명 소스코드 #include #include using namespace std; int main() { int N; cin >> N; int* arr = new int[N]; for (int i = 0; i > arr[i]; sort(arr, arr+N); for (int i = 0; i < N; ++i)cout
2023.07.13

문제설명

 

소스코드

#include <iostream>
#include <algorithm>
using namespace std;
class XY {
public:
	int x; int y;
	bool operator < (XY& arr) { 
		if (this->x < arr.x) return true;
		else
		{
			if ((this->x == arr.x) && (this->y < arr.y)) return true;
			else return false;
		}
	}
};
int main() {
	ios_base::sync_with_stdio(false); //표준 스트림 동기화 해제
	cin.tie(NULL); //입력과 출력 연결 끊기
	int N;
	cin >> N;
	XY* arr = new XY[N];
	for (int i = 0; i < N; ++i) cin >> arr[i].x >> arr[i].y;
	sort(arr, arr + N);
	for (int i = 0; i < N; ++i) cout << arr[i].x << " " << arr[i].y << '\n';
}

 

설명

  • 클래스 배열로 좌표를 나타냄
  • algorithm 라이브러리의 sort() 함수를 올바르게 실행하려면 클래스 내부의 연산자 < 의 재정의가 필요함
  • x좌표가 작으면 무조건 true를 리턴하고(오름차순)
    x좌표가 같고 y가 작으면 true를 리턴한다(오름차순)
    이외의 경우는 false를 리턴한다.
  • 표준 스트림 동기화 해제, 입출력 연결 끊기, endl 대신 '\n'을 사용하여 시간초과 방지를 한다.

문제설명

 

소스코드

#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;
int main() {
	int N;
	vector<int> arr;
	cin >> N;
	int input;
	for (int i = 0; i < N; i++)
	{
		cin >> input;
		arr.push_back(input);
	}
	sort(arr.begin(), arr.end());
	arr.erase(unique(arr.begin(), arr.end()), arr.end());
	for (int i = 0; i < arr.size(); ++i) cout << arr[i] << " ";
}

 

설명

  • 벡터로 입력된 값을 받는다.
  • sort 함수를 이용하여 벡터를 오름차순으로 정렬한다.
  • unique(arr.begin(), arr.end()) -> 중복된 원소를 뒤로 밀어버려서 벡터 뒤엔 중복된 원소만 남게됨. 이후 중복된 원소의 첫 번째 원소의 주소를 리턴
  • arr.erase(unique(arr.begin(), arr.end()), arr.end()) -> 중복된 원소의 첫 번째 부터 벡터의 마지막까지를 지워버림

문제설명

 

소스코드

#include <iostream>
#include <algorithm>
using namespace std;
bool compare(int a, int b) { return a > b; }
int main()
{
	string N;
	cin >> N;
	sort(N.begin(), N.end(),compare);
	cout << N;
}

 

설명

  • string형으로 N을 받는다.
  • algorithm 라이브러리의 sort()함수를 이용하여 정렬한다.
  • sort()함수의 첫 번째 매개값으로 N의 시작 주소, 두 번째 매개값으로 N의 끝 주소, 세 번째 매개값으로 내림차순으로 정렬하게 해주는 compare함수를 넘긴다.

문제설명

 

소스코드

#include <iostream>
#include <algorithm>
using namespace std;
bool compare(int a, int b) { return a > b; }
int main()
{
	int N, k;
	cin >> N >> k;
	int* arr = new int[N];
	for (int i = 0; i < N; ++i) cin >> arr[i];
	sort(arr, arr + N, compare);
	cout << arr[k - 1];
}

 

설명

  • 기본 sort() 함수에 매개값으로 compare() 함수를 전달
  • 위 코드같이 compare 함수를 정의하면 오름차순이 아니라 내림차순으로 정렬된다.

문제설명

 

소스코드

#include <iostream>
#include <algorithm>
using namespace std;
int main()
{
	int arr[5]; int sum = 0;
	for (int i = 0; i < 5; ++i)
	{
		cin >> arr[i];
		sum += arr[i];
	}
	sort(arr, arr + 5);
	cout << sum / 5 << endl;
	cout << arr[2];
}

문제설명

 

소스코드

#include <iostream>
using namespace std;
int main()
{
	ios_base::sync_with_stdio(false); //표준 스트림 동기화 해제
	cin.tie(NULL); //입력과 출력 연결 끊기
	int N;
	cin >> N;
	int arr[10001] = { 0 };
	for (int i = 0; i < N; ++i)
	{
		int idx;
		cin >> idx;
		arr[idx] += 1;
	}
	for (int i = 1; i < 10001; ++i) 
	{
		for (int j = 0; j < arr[i]; ++j) cout << i << '\n';
	}
}

 

설명

  • 표준 스트림 동기화 해제, 입출력 연결 끊기, endl 대신 \n 쓰기 -> 시간 초과 방지
  • 첫 번째 for문은 예를들어 55를 입력하면 arr[55]의 값이 1씩증가한다.
  • 이중 for문의 안쪽 for문을 보면, arr[55]의 값이 3이면 3번 반복하여 출력하게 한다.

 

문제설명

 

소스코드

#include <iostream>
#include <algorithm>
using namespace std;
int main()
{
	ios_base::sync_with_stdio(false); //표준 스트림 동기화 해제
	cin.tie(NULL); //입력과 출력 연결 끊기
	int N;
	cin >> N;
	int* arr = new int[N];
	for (int i = 0; i < N; ++i) cin >> arr[i];
	sort(arr, arr+N);
	for (int i = 0; i < N; ++i)cout << arr[i] << '\n';
}

 

설명

  • algorithm 라이브러리에 있는 sort() 함수를 사용
  • 배열 동적할당
  • sort 함수의 첫 번째 매개변수는 배열의 포인터, 두 번째 매개변수는 배열의 포인터 + 배열의 크기를 넣어주면 내림차순으로 정렬이 된다.
  • sort(arr, arr + N)
시간제한이 C / C++기준으로 2초이기 때문에 아래의 과정을 수행해야한다.

C와 C++과의 표준 스트림 동기화 해제입력과 출력 연결 해제endl 대신 \n 쓰기
cout(출력) cin(입력)과의 묶인것을 해제시키지 않고, C와 C++과의 입출력 동기화를 해제하지 않으면 이 문제는 틀리게 된다.
기본적으로 C++에서는 C의 표준 스트림이 동기화가 되어있다.
C와 C++가 동일한 버퍼를 공유한다는 말이다.
이러한 동기화는 성능을 저하시키지만 스레드로부터 안전하기 때문에 동기화 상태로 두는 것이 더 좋긴 하다.
하지만 알고리즘 문제풀이 또는 예외처리나 멀티스레드 작업을 필요로 하지 않는 작업에서는 동기화를 끊어주면 속도가 빨라진다.
(C++ 표준 스트림이 독립적으로 IO(intput, output)버퍼링을 할 수 있다는 것이다. 이렇게 되면 상당히 많은 양의 입출력이 있을 경우 동기화되어있는 상태에 비해 성능이 많이 좋아진다.)

endl은 단순히 줄 바꿈만 해주는 것이 아니라 출력 버퍼를 비우는 역할까지 한다.
매 줄 바꿈마다 endl을 쓰면 입출력을 끊어주는 효과를 볼 수 없다.

문제설명

 

소스코드

#include <iostream>
#include <algorithm>
using namespace std;
int main()
{
	int N;
	cin >> N;
	int* arr = new int[N];
	for (int i = 0; i < N; ++i) cin >> arr[i];
	sort(arr, arr+N);
	for (int i = 0; i < N; ++i)cout << arr[i] << endl;
}

 

설명

  • algorithm 라이브러리에 있는 sort() 함수를 사용
  • 배열 동적할당
  • sort 함수의 첫 번째 매개변수는 배열의 포인터, 두 번째 매개변수는 배열의 포인터 + 배열의 크기를 넣어주면 내림차순으로 정렬이 된다.
  • sort(arr, arr + N)