※ 글쓴이는 취미로 코딩을 익혀보는 사람이라 정확하지 않은 내용을 담고 있을 수 있다 ※

 

이번에 볼 문제는 백준 1071번 문제인 소트이다.
문제는 아래 링크를 확인하자.

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

 

1071번: 소트

N개의 정수가 주어지면, 이것을 연속된 두 수가 연속된 값이 아니게 정렬(A[i] + 1 ≠ A[i+1])하는 프로그램을 작성하시오. 가능한 것이 여러 가지라면 사전순으로 가장 앞서는 것을 출력한다.

www.acmicpc.net

현재 남아있는 수 중 가장 작은 수를 최대한 먼저 사용해나가야 사전순으로 가장 빠른 배열이 되게끔 수들을 나열할 수 있을 것이다. 아직 나열하지 않은 가장 작은 수를 mn1, 두번째로 작은(mn1과 다른) 수를 mn2라 하고 바로 이전에 사용한 수를 old라 할 때(초기값은 음의 무한대), old + 1 = mn1을 만족한다면 mn2를, 그렇지 않다면 mn1를 다음 수로 나열해나가자. 단, 아직 나열하지 않은 서로 다른 수가 mn1과 mn2두 종류뿐이고(mn1 < mn2) mn1 + 1 = mn2를 만족한다면 mn2를 먼저 전부 나열하고 남은 mn1을 나열해주자.

 

위와 같은 작동을 하는 코드를 작성해 문제를 해결하자. 글쓴이는 스택 자료구조를 이용하여 위 내용을 구현했다.

 

아래는 제출한 소스코드이다.

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

int cnt[1001];
vector<pair<int, int>> stk;

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

	int N; cin >> N;
	while (N--) {
		int x; cin >> x;
		cnt[x]++;
	}

	for (int i = 1000; i > -1; i--) {
		if (cnt[i]) stk.emplace_back(make_pair(i, cnt[i]));
	}

	while (stk.size() > 2) {
		auto p1 = stk.back(); stk.pop_back();
		auto p2 = stk.back(); stk.pop_back();
		auto p3 = stk.back(); stk.pop_back();
		for (int k = 0; k < p1.second; k++) cout << p1.first << ' ';
		if (p1.first + 1 == p2.first) {
			cout << p3.first << ' ';
			p3.second--;
		}
		if (p3.second) stk.emplace_back(p3);
		stk.emplace_back(p2);
	}

	if (stk.size() == 2) {
		auto p1 = stk.back(); stk.pop_back();
		auto p2 = stk.back(); stk.pop_back();
		if (p1.first + 1 == p2.first) {
			for (int k = 0; k < p2.second; k++) cout << p2.first << ' ';
			for (int k = 0; k < p1.second; k++) cout << p1.first << ' ';
		}
		else {
			for (int k = 0; k < p1.second; k++) cout << p1.first << ' ';
			for (int k = 0; k < p2.second; k++) cout << p2.first << ' ';
		}
	}
	else {
		auto p1 = stk.back(); stk.pop_back();
		for (int k = 0; k < p1.second; k++) cout << p1.first << ' ';
	}
}
728x90

'BOJ' 카테고리의 다른 글

[BOJ 25826 // C++] 2차원 배열 다중 업데이트 단일 합  (0) 2023.03.16
[BOJ 25943 // C++] 양팔저울  (1) 2023.03.15
[BOJ 25936 // C++] Rain Gauge  (0) 2023.03.13
[BOJ 5602 // C++] 問題1  (0) 2023.03.13
[BOJ 16397 // C++] 탈출  (0) 2023.03.12

+ Recent posts