[백준 BOJ] 10867번 중복 빼고 정렬하기 (C++/cpp)

2022. 8. 18. 15:55PS (Program Solving)/BOJ (백준)

문제 설명

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

 

10867번: 중복 빼고 정렬하기

첫째 줄에 수의 개수 N (1 ≤ N ≤ 100,000)이 주어진다. 둘째에는 숫자가 주어진다. 이 수는 절댓값이 1,000보다 작거나 같은 정수이다.

www.acmicpc.net

백준 BOJ 10867번 중복 빼고 정렬하기 문제 사진

 

접근 방법 - 정렬의 기본 문제

백준의 10867번 문제는 정렬을 이용하여 해결해야 하는 문제들 중 비교적 기본적인 문제이다.

해당 문제는, 입력받은 정수들에 대하여 중복된 숫자를 제외하여 오름차순으로 정렬한 결과를 출력해야 하는 문제이다.

필자는 이 문제를 처음 봤을 땐 계수 정렬을 사용하면 좋겠다고 판단하였는데 음수도 입력값으로 나오기 때문에 결국 나름대로 노가다를 하기로 했다. (...)

하지만 늘 사용하는 정렬 함수만 있다면 이 문제 또한 어렵지 않게 풀 수 있을 것으로 예상된다.

혹여나 해당 문제를 해결하는 데에 어려움을 겪고 있다면, 아래의 설명과 코드를 한번 참고해보길 바란다.

필자는 아래의 순서대로 코드를 작성하여 문제를 해결하였다.

 

코드의 실행 순서

1) 입력값들을 저장할 배열(arr)을 전역 변수로 선언해둔다.

 

2) 입력값들의 개수(n)를 입력받는다.

 

3) n의 크기만큼 arr의 값들을 입력받는다.

 

4) sort() 함수를 이용하여 arr의 값들을 오름차순으로 정렬한다.

 

5) 중복되는 숫자를 판별하기 위해, 변수 cnt에 arr의 첫번째 값을 넣는다.

그와 동시에 cnt에 저장한 arr의 첫번째 값을 즉시 출력한다.

 

6) 반복문을 통해 arr의 두번째 값부터 마지막 값까지 하여 아래의 연산을 취한다.

- cnt와 현재 탐색값이 같다면, 이는 이미 앞에서 출력된 숫자이며 중복된 숫자임을 뜻한다.

이 경우엔, 다음 순서의 반복문을 실행하도록 한다.

- 반면에 cnt와 현재 탐색값이 다르다면, 이는 처음 나타나는 숫자임을 뜻한다.

이 경우엔, 해당 숫자를 출력한다. 그리고 해당 숫자의 중복을 없애기 위해 cnt에 현재 탐색값을 저장한다.

 

7) 모든 출력이 완료되었다면, 실행 종료한다.

반응형

 

성공한 코드

#define _CRT_SECURE_NO_WARNINGS
#pragma warning(disable: 4996)
#include <iostream>
#include <algorithm>
#define endl '\n'
using namespace std;

//백준 10867번 코드
int arr[100001];
int main() {
	ios::sync_with_stdio(false);
	cin.tie(NULL);	cout.tie(NULL);

	int n;
	cin >> n;
	for (int i = 0; i < n; i++) {
		cin >> arr[i];
	}
	sort(arr, arr + n);

	int cnt = arr[0];
	cout << arr[0] << " ";
	for (int i = 1; i < n; i++) {
		if (cnt == arr[i]) { continue; }
		else {
			cout << arr[i] << " ";
			cnt = arr[i];
		}
	}
	cout << endl;
}

 

제출 결과

백준 BOJ 10867번 중복 빼고 정렬하기 문제 C++ 제출 결과

(2022.06.28 백준 10867번 문제 제출 결과)

반응형