문제

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

 

11650번: 좌표 정렬하기

첫째 줄에 점의 개수 N (1 ≤ N ≤ 100,000)이 주어진다. 둘째 줄부터 N개의 줄에는 i번점의 위치 xi와 yi가 주어진다. (-100,000 ≤ xi, yi ≤ 100,000) 좌표는 항상 정수이고, 위치가 같은 두 점은 없다.

www.acmicpc.net

 

풀이

기본적인 sort 정렬(2개짜리) 문제였다. 

이런 정렬 같은 경우 sort()를 활용하는 것과, priority_queue + bool operator() 활용하는 두 가지 모두 알아두자.

 

코드

#include<iostream>
#include<algorithm>
#include<vector>
using namespace std;
int N;
vector<pair<int, int>> arr;
bool cmp(pair<int,int> a,pair<int,int> b) {
	if (a.first == b.first) {
		return a.second < b.second;
	}
	return a.first < b.first;
}

int main() {
	cin >> N;

	int x, y;
	for (int i = 0; i < N; i++) {
		cin >> x >> y;
		arr.push_back({ x,y });



	}

	sort(arr.begin(), arr.end(), cmp);

	for (int i = 0; i < N; i++) {
		cout << arr[i].first << " " << arr[i].second << '\n';

	}


	return 0;
}

'알고리즘 공부 > 백준' 카테고리의 다른 글

[백준] 최대 힙 (11279/C++)  (0) 2022.01.26
[백준] 최소 힙 (1927/C++)  (0) 2022.01.26
[백준] 덩치 (7568/C++)  (0) 2022.01.23
[백준] 수 정렬하기 3 (10989/C++)  (0) 2022.01.23
[백준] 나이순 정렬 (10814/C++)  (0) 2022.01.22

문제

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

 

7568번: 덩치

우리는 사람의 덩치를 키와 몸무게, 이 두 개의 값으로 표현하여 그 등수를 매겨보려고 한다. 어떤 사람의 몸무게가 x kg이고 키가 y cm라면 이 사람의 덩치는 (x, y)로 표시된다. 두 사람 A 와 B의 덩

www.acmicpc.net

 

풀이

기준을 정확히 잡고 풀면 쉬운 문제였다. 이중 for문을 통해 전부 비교해주면서 자기보다 키, 몸무게 모두 큰 사람이 있다면 1씩 cnt를 증가하면 된다.  (&&사용)

 

그게 아니라면 cnt는 그대로 유지한다.

 

코드

#include<iostream>
#include<vector>
#include<queue>
using namespace std;
int N;
vector<int> result;
vector<pair<int, int>> arr;
int main() {

	cin >> N;

	for (int i = 0; i < N; i++) {
		int a, b;
		cin >> a >> b;
		arr.push_back({ a,b });

	}
	int cnt = 0;
	for (int i = 0; i < N; i++) {
		cnt = 1;
		for (int j = 0; j < N; j++) {
			if (arr[i].first < arr[j].first && arr[i].second < arr[j].second) {
				cnt++;
			}


		}
		result.push_back(cnt);
	}


	for (int i = 0; i < result.size(); i++) {
		cout << result[i] << " ";
	}
	return 0;
}

문제

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

 

10989번: 수 정렬하기 3

첫째 줄에 수의 개수 N(1 ≤ N ≤ 10,000,000)이 주어진다. 둘째 줄부터 N개의 줄에는 수가 주어진다. 이 수는 10,000보다 작거나 같은 자연수이다.

www.acmicpc.net

 

풀이

굉장히 쉬운 정렬 문제인 줄 알고 그냥 들이댔다가 큰코다쳤다. 

메모리 초과가 뜬 걸 보고 문제를 다시 천천히 읽었다. N이 10,000,000까지 가능하다. 

이를 전부 입력받고 sort()하면 메모리가 남아나질않음을 인지했어야 했다.

 

다시 문제를 처음으로 돌아가 result배열에 한 칸씩 카운트를 늘려주는 방식으로 풀었다. (입력 숫자는 10000 이하이므로)

좋은 문제 같다.

 

코드

#include<iostream>
#include<vector>
#include<algorithm>
using namespace std;
int result[10001];
int N;
int main() {
//단순하게 sort()로 풀면 메모리초과 (공간복잡도)
//입력값을 전부 저장하면 메모리 초과 (10,000,000)
	ios::sync_with_stdio(false);
	cin.tie(NULL);
	cout.tie(NULL);

	cin >> N;
	

	for (int i = 0; i < N; i++) {
		int a;
		cin >> a;

		result[a]++;
	}
	//탐색
	for (int j = 0; j < 10001; j++) {
		for (int k = 0; k<result[j];k++){
			if (result[j] == 0) break;
			else{
				cout << j << '\n';
			}


		}

	}

	return 0;
}

문제

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

 

10814번: 나이순 정렬

온라인 저지에 가입한 사람들의 나이와 이름이 가입한 순서대로 주어진다. 이때, 회원들을 나이가 증가하는 순으로, 나이가 같으면 먼저 가입한 사람이 앞에 오는 순서로 정렬하는 프로그램을

www.acmicpc.net

 

풀이

구조체를 만들어 각 입력에 순서표를 달아주었다.

이를 통하여 Sort() + 우선순위 조건을 추가하여 정렬하는 문제였다.

 

코드

#include<vector>
#include<iostream>
#include<queue>
#include<algorithm>
#include<string>
using namespace std;
int N;
struct human{
	int num;
	int age;
	string name;

};

bool cmp(human a,human b) {
	if (a.age == b.age) {
		return	a.num < b.num;

	}
	
	return a.age < b.age;
	
}
int main() {
	ios::sync_with_stdio(false);
	cin.tie(NULL);
	
	cin >> N;
	vector<human> arr;
	for (int i = 0; i < N; i++) {
		int a;
		string b;
		cin >> a >> b;

		arr.push_back({ i,a,b });

	}

	sort(arr.begin(), arr.end(), cmp);

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



	return 0;
}

+ Recent posts