본문 바로가기

컴퓨터/백준 알고리즘

백준 알고리즘 1427번: 소트인사이드 [C++]

문제 출처: www.acmicpc.net/problem/1427

 

1427번: 소트인사이드

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

www.acmicpc.net

1. 코드

#include <iostream>
#include <string>

using namespace std;

int main(void)
{
	string number;
	int arr[10] = { 0, };
	cin >> number;

	for (int i = 0; i < number.length(); i++)
		arr[number[i] - '0']++;

	for (int i = 9; i >= 0; i--)
		for (int j = 0; j < arr[i]; j++)
			cout << i;
    
	return 0;
}

(실행)

2. 풀이

이 문제는 문자열과 카운팅 정렬을 이용하여 해결했다.

string number;
int arr[10] = { 0, };
cin >> number;

먼저 string number를 이용하여 number라는 사용자에게 입력받을 문자열을 생성하고 카운팅 정렬에 활용할 배열 arr을 10 크기만 사용한다. 문제를 읽어보면 각 자릿수를 내림차순으로 정렬을 하라고 나와있는데 각 자릿수에 범위는 0~9까지이므로 배열을 10 크기로 선언한다.

for (int i = 0; i < number.length(); i++)
    arr[number[i] - '0']++;

그리고 입력받은 number의 요소를 인덱스 값으로 배열 arr의 배열 요소를 증가시키는데 이때 number[i] - '0'은 현재 number는 문자로서 입력이 되어있기 때문에 '0'을 빼줌으로써 number에 저장되어있는 문자를 정수로 변환시킨다.

for (int i = 9; i >= 0; i--)
    for (int j = 0; j < arr[i]; j++)
        cout << i;

그러면 이제 배열 arr로 인해 카운팅 정렬을 마친 상태이다. 문제에서 요구하는 것은 내림차순이기 때문에 9부터 0까지 접근을 하고 배열 요소의 수만큼 배열의 인덱스 값을 출력하면 문제에서 요구하는 답이 나온다.