Outdated/Algorithm Solution

[BOJ] 1083번 소트

해달 2020. 4. 20. 18:00

복기

버블정렬은 내부 반복문이 끝날 때마다 자리 하나가 고정이 된다.


코드

  • C++ 17


#include <iostream>

 

#define min(a, b) (a < b) ? a : b

 

using namespace std;

 

int N, S;

int Arr[50];

 

int main()

{

    ios::sync_with_stdio(false);

    cin.tie(nullptr);

    cout.tie(nullptr);

 

    cin >> N;

    for (size_t i = 0; i < N; i++)

        cin >> Arr[i];

    cin >> S;

 

    // 본 문제는 버블정렬을 이용하는 것이다.

    // 반복이 끝나는 것은 정렬이 다 되었거나,

    // 교환을 더 이상 할 수 없을 때다.

    for (size_t i = 0; i < N; i++)

    {

        // 교환을 더 할 수 없으면 반복을 종료한다.

        if (S == 0)

            break;

 

        // 현재 값을 최댓값으로 설정한다.

        int max = Arr[i], maxIdx = i;

 

        // 교환할 수 있는 횟수는 아래와 같다.

        size_t count = min(N, i + 1 + S);

        for (size_t j = i + 1; j < count; j++)

        {

            // 이동할 수 있는 범위에서 최댓값을 찾는다.

            if (max < Arr[j])

            {

                max = Arr[j];

                maxIdx = j;

            }

        }

 

        // 버블정렬은 내부 반복문을 완료할 때마다

        // 가장 상위값의 자리가 고정이 된다.

        // 그러므로 그 값이 이동한 횟수만큼 차감한다.

        S -= maxIdx - i;

 

        // 값을 반영한다.

        for (size_t j = maxIdx; j > i; j--)

            Arr[j] = Arr[j - 1];

        Arr[i] = max;

    }

 

    for (size_t i = 0; i < N; i++)

        cout << Arr[i] << ' ';

}


  • C# 6.0


using System;

 

namespace Csharp

{

    class Program

    {

        static void Main(string[] args)

        {

            int N = Convert.ToInt32(Console.ReadLine());

            int[] arr = new int[N];

            var nums = Console.ReadLine().Split();

            for (int i = 0; i < N; i++)

            {

                arr[i] = Convert.ToInt32(nums[i]);

            }

            int S = Convert.ToInt32(Console.ReadLine());

 

            for (int i = 0; i < N - 1; i++)

            {

                if (S == 0)

                    break;

 

                int max = arr[i], maxIdx = i;

                int count = Math.Min(N, i + 1 + S);

                for (int j = i + 1; j < count; j++)

                {

                    if (max < arr[j])

                    {

                        max = arr[j];

                        maxIdx = j;

                    }

                }

                S -= maxIdx - i;

 

                for (int j = maxIdx; j > i; j--)

                    arr[j] = arr[j - 1];

                arr[i] = max;

            }

 

            for (int i = 0; i < N; i++)

                Console.Write($"{arr[i]} ");

        }

    }

}


  • Python 3


from sys import stdin

input = stdin.readline

 

N = int(input())

arr = list(map(int, input().split()))

S = int(input())

 

for i in range(N - 1):

    if S == 0:

        break

 

    max, idx = arr[i], i

    for j in range(i + 1, min(N, i + 1 + S)):

        if max < arr[j]:

            max = arr[j]

            idx = j

    S -= idx - i

    

    for j in range(idx, i, -1):

        arr[j] = arr[j - 1]

    

    arr[i] = max

 

print(' '.join(map(str, arr)))


'Outdated > Algorithm Solution' 카테고리의 다른 글

[BOJ] 6581번 HTML  (0) 2020.04.27
[BOJ] 10174번 팰린드롬  (0) 2020.04.27
[BOJ] 1431번 시리얼 번호  (0) 2020.04.20
[BOJ] 3101번 토끼의 이동  (0) 2020.04.13
[BOJ] 4948번 베르트랑 공준  (0) 2020.04.13