[백준 BOJ] 1427번 소트인사이드 (C++/cpp)

2022. 6. 3. 03:14PS (Program Solving)/BOJ (백준)

문제 설명

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

 

1427번: 소트인사이드

첫째 줄에 정렬하려고 하는 수 N이 주어진다. N은 1,000,000,000보다 작거나 같은 자연수이다.

www.acmicpc.net

백준 BOJ 1427번 소트인사이드 문제 사진

 

접근 방법 - 아스키코드에 대한 계수 정렬을 이용한 문제

백준의 1427번 문제는 정렬, 특히나 계수 정렬을 이용하여 해결해야 하는 문제이다.

해당 문제는, 띄어쓰기 없이 붙어있는 숫자들을 내림차순으로 정렬하여 출력해야 하는 문제이다.

계수 정렬과 관련하여 필자가 이전에 해결한 문제에 대해 작성한 글이 있으니 아래의 링크도 함께 참고해볼 것을 권한다.

https://smary-it.tistory.com/116

 

[백준 BOJ] 10989번 수 정렬하기 3 (C++/cpp)

문제 설명 https://www.acmicpc.net/problem/10989 10989번: 수 정렬하기 3 첫째 줄에 수의 개수 N(1 ≤ N ≤ 10,000,000)이 주어진다. 둘째 줄부터 N개의 줄에는 수가 주어진다. 이 수는 10,000보다 작거나 같..

smary-it.tistory.com

다만 위의 문제와 다른 점이 있다면, 해당 문제는 아스키코드의 특성도 함께 고려하여 계수 정렬을 실행해야 한다는 점이다.

해당 알고리즘에 대해 어려움을 겪고 있다면, 아래의 설명과 코드를 참고해보길 바란다.

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

 

코드의 실행 순서

1) 크기가 10인 배열(arr)을 전역 변수로 선언해둔다.

(여기서, 입력값으로 받을 숫자들은 모두 0 ~ 9 사이의 숫자들이기 때문에 배열의 크기를 10으로 해두었다.)

 

2) 문자형 변수인 c를 선언해두고 이를 이용하여 숫자를 하나씩 입력받는다.

- 하나씩 입력받는 즉시, 해당 숫자의 출현 빈도수를 카운팅하며 arr의 배열값들을 갱신한다.

- 입력이 종료될 때까지 이를 실행하도록 한다.

 

3) 모든 숫자의 카운팅이 끝났다면, 숫자들을 내림차순으로 출력하도록 한다.

- 배열 번호(i)를 9에서부터 시작하여 0까지 하여, arr의 배열값들을 탐색한다.

만일 해당 탐색값이 0이 아니라면, 이는 해당 숫자가 출현한 적이 있다는 것을 뜻한다.

따라서 이 경우엔, 배열값의 크기( arr[i] )만큼 배열 번호(i)를 출력하도록 한다.

(다만 해당 탐색값이 0이라면, 이는 해당 숫자가 출현한 적이 없다는 것을 뜻한다. 이 경우엔, 어떤 것도 실행하지 않고 넘어가도록 한다.

 

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

반응형

 

성공한 코드

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

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

	char c;
	while (1) {
		cin >> c;
		if (cin.eof() == 1) { break; }
		arr[c - '0']++;
	}
	for (int i = 9; i >= 0; i--) {
		if (arr[i] != 0) {
			for (int j = 0; j < arr[i]; j++) {
				cout << i;
			}
		}
	}
	cout << endl;
}

 

제출 결과

백준 BOJ 1427번 소트인사이드 문제 C++ 제출 결과

(2022.05.16 백준 1427번 문제 제출 결과)

반응형