์•Œ๊ณ ๋ฆฌ์ฆ˜ ํ’€์ด/baekjoon

[๋ฐฑ์ค€] 2751๋ฒˆ : ์ˆ˜ ์ •๋ ฌํ•˜๊ธฐ 2

mmin.h 2020. 8. 5. 13:46

์•ˆ๋…•ํ•˜์„ธ์š” ์ฃผ์ธ์žฅ H์ž…๋‹ˆ๋‹ค. 

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

 

2751๋ฒˆ: ์ˆ˜ ์ •๋ ฌํ•˜๊ธฐ 2

์ฒซ์งธ ์ค„์— ์ˆ˜์˜ ๊ฐœ์ˆ˜ N(1 ≤ N ≤ 1,000,000)์ด ์ฃผ์–ด์ง„๋‹ค. ๋‘˜์งธ ์ค„๋ถ€ํ„ฐ N๊ฐœ์˜ ์ค„์—๋Š” ์ˆซ์ž๊ฐ€ ์ฃผ์–ด์ง„๋‹ค. ์ด ์ˆ˜๋Š” ์ ˆ๋Œ“๊ฐ’์ด 1,000,000๋ณด๋‹ค ์ž‘๊ฑฐ๋‚˜ ๊ฐ™์€ ์ •์ˆ˜์ด๋‹ค. ์ˆ˜๋Š” ์ค‘๋ณต๋˜์ง€ ์•Š๋Š”๋‹ค.

www.acmicpc.net

 

๋ฌธ์ œ

N๊ฐœ์˜ ์ˆ˜๊ฐ€ ์ฃผ์–ด์กŒ์„ ๋•Œ, ์ด๋ฅผ ์˜ค๋ฆ„์ฐจ์ˆœ์œผ๋กœ ์ •๋ ฌํ•˜๋Š” ํ”„๋กœ๊ทธ๋žจ์„ ์ž‘์„ฑํ•˜์‹œ์˜ค.

์ž…๋ ฅ

์ฒซ์งธ ์ค„์— ์ˆ˜์˜ ๊ฐœ์ˆ˜ N(1 ≤ N ≤ 1,000,000)์ด ์ฃผ์–ด์ง„๋‹ค. ๋‘˜์งธ ์ค„๋ถ€ํ„ฐ N๊ฐœ์˜ ์ค„์—๋Š” ์ˆซ์ž๊ฐ€ ์ฃผ์–ด์ง„๋‹ค. ์ด ์ˆ˜๋Š” ์ ˆ๋Œ“๊ฐ’์ด 1,000,000๋ณด๋‹ค ์ž‘๊ฑฐ๋‚˜ ๊ฐ™์€ ์ •์ˆ˜์ด๋‹ค. ์ˆ˜๋Š” ์ค‘๋ณต๋˜์ง€ ์•Š๋Š”๋‹ค.

์ถœ๋ ฅ

์ฒซ์งธ ์ค„๋ถ€ํ„ฐ N๊ฐœ์˜ ์ค„์— ์˜ค๋ฆ„์ฐจ์ˆœ์œผ๋กœ ์ •๋ ฌํ•œ ๊ฒฐ๊ณผ๋ฅผ ํ•œ ์ค„์— ํ•˜๋‚˜์”ฉ ์ถœ๋ ฅํ•œ๋‹ค.

์˜ˆ์ œ ์ž…๋ ฅ 1 ๋ณต์‚ฌ

5 5 4 3 2 1

์˜ˆ์ œ ์ถœ๋ ฅ 1 ๋ณต์‚ฌ

1 2 3 4 5

 

ํ•ด๋‹น ๋ฌธ์ œ๋Š” ํ€ต์ •๋ ฌ๋กœ ํ’€์–ด๋ณผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. 

ํ•˜์ง€๋งŒ ํ€ต์ •๋ ฌ์˜ ๋ฌธ์ œ๋Š” ์–ธ์ œ๋‚˜ ์‹œ๊ฐ„๋ณต์žก๋„ O(N*log N)๊ฐ€ ๋˜์ง„ ์•Š์•„์š”. 

๊ทธ๋ ‡๊ธฐ ๋•Œ๋ฌธ์— ํ•ด๋‹น ๋ฌธ์ œ๋Š” ์•„๋ž˜๋Š” ๋ฌธ์ œ๋Š” ์—†์ง€๋งŒ ์ •๋‹ต ์ฒ˜๋ฆฌ๊ฐ€ ๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. 

๊ทธ๋ ‡๊ธฐ ๋•Œ๋ฌธ์— C++ ์˜ sortํ•จ์ˆ˜๋ฅผ ์ด์šฉํ•ด์„œ ์‚ฌ์šฉํ•ด์•ผ์ง€๋งŒ ์–ธ์ œ๋‚˜ O(N*log N)๊ฐ€ ๋ฉ๋‹ˆ๋‹ค.

#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>

int number, data[1000000];

void quickSort(int* data, int start, int end) {
    if (start >= end) { // ์›์†Œ๊ฐ€ 1๊ฐœ์ธ ๊ฒฝ์šฐ ๊ทธ๋Œ€๋กœ ๋‘๊ธฐ 
        return;
    }

    int key = start; // ํ‚ค๋Š” ์ฒซ ๋ฒˆ์งธ ์›์†Œ
    int i = start + 1, j = end, temp;

    while (i <= j) { // ์—‡๊ฐˆ๋ฆด ๋•Œ๊นŒ์ง€ ๋ฐ˜๋ณต
        while (data[i] <= data[key]) { // ํ‚ค ๊ฐ’๋ณด๋‹ค ํฐ ๊ฐ’์„ ๋งŒ๋‚  ๋•Œ๊นŒ์ง€ 
            i++;
        }
        while (data[j] >= data[key] && j > start) { // ํ‚ค ๊ฐ’๋ณด๋‹ค ์ž‘์€ ๊ฐ’์„ ๋งŒ๋‚  ๋•Œ๊นŒ์ง€ 
            j--;
        }
        if (i > j) { // ํ˜„์žฌ ์—‡๊ฐˆ๋ฆฐ ์ƒํƒœ๋ฉด ํ‚ค ๊ฐ’๊ณผ ๊ต์ฒด 
            temp = data[j];
            data[j] = data[key];
            data[key] = temp;
        }
        else { // ์—‡๊ฐˆ๋ฆฌ์ง€ ์•Š์•˜๋‹ค๋ฉด i์™€ j๋ฅผ ๊ต์ฒด 
            temp = data[i];
            data[i] = data[j];
            data[j] = temp;
        }
    }

    quickSort(data, start, j - 1);
    quickSort(data, j + 1, end);
}

int main(void) {
    scanf("%d", &number);
    for (int i = 0; i < number; i++) {
        scanf("%d", &data[i]);
    }
    quickSort(data, 0, number - 1);
    for (int i = 0; i < number; i++) {
        printf("%d\n", data[i]);
    }
    return 0;
}
#include <stdio.h>
#include <algorithm>

int number, data[1000000];

int main(void) {
	scanf("%d", &number);
	for (int i = 0; i < number; i++) {
		scanf("%d", &data);
	}

	std::sort(data, data + number);
	for (int i = 0; i < number; i++) {
		printf("%d\n", data[i]);
	}
	return 0; 
}