[C언어] 백준 1427 : 소트인사이드

13849 단어 C백준정렬C

생각의 흐름

  1. 음.. scanf를 하나만 써야되나? 여러개를 쓸 경우 구분할 수 없을까? 힘들겠다 scanf는 하나만 써도 될 것 같다.
  2. 2143을 각각 arr[i]에 하나씩 넣어야 되는데, 음.. 각 자리수를 쪼개서 넣자. while(n > 0)반복문으로 %10, /10을 사용하자.
  3. 그러면 arr[i]에 다 들어갔을테니, 정렬을 해주자. 원래라면 선택정렬이나 버블정렬을 했을텐데, 우리는 이전에 퀵정렬을 배웠으니 내장된 퀵정렬을 사용해보자.
  4. 출력!

내가 푼 풀이

#include <stdio.h>
#include <stdlib.h>

int compare(const void *a, const void *b) //
{
    int num1 = *(int *)a;
    int num2 = *(int *)b;
    if (num1 < num2) // 내림차순이라 부등호 바꿈
        return 1;
    if (num1 > num2)
        return -1;
    return 0;
}

int main()
{
    int i;
    int n;
    int len;
    scanf("%d", &n);
    int t = n;
    int s = n;
    len = 0;
    while (s > 0)
    {
        t = s % 10;
        s = s / 10;
        len++;
    }
    int arr[len]; // 처음에 int arr[n]으로 걍 때려박았는데
    // 손해가 너무 심해서 len수를 구한다음에 딱 저장할 공간만 만들어주었다.
    i = 0;
    while (n > 0)
    {
        t = n % 10;
        n = n / 10;
        arr[i] = t;
        i++;
    } // arr[i]에 각 자리수 넣어주기
    qsort(arr, len, sizeof(int), compare); // 퀵 정렬
    i = 0;
    while (i < len)
    {
        printf("%d", arr[i]);
        i++;
    }
}

다른 사람 풀이

https://miingjeong.tistory.com/47
이 사람은 char형으로 입력받았다. 따라서 %10 /10을 할 필요가 없다.
또한 문자형이기에 바로 strlen을 사용해서 길이를 구할 수 있었다.
char형 배열을 int형으로 다시 넣어주기 위해 arr배열을 만들었고, -'0'을 통해 int형으로 바꾸어주며 넣었다.

#include <stdio.h>
#include <string.h>
int main()
{

    int arr[10000] = {0, };
    char s[10000];
    int tmp = 0;
    int i, j;
    scanf("%s", &s);

    for (i = 0; i < strlen(s); i++)
        arr[i] = s[i] - '0';

    for (i = 0; i < strlen(s) - 1; i++)
    {
        for (j = 0; j < strlen(s) - 1; j++)
        {
            if (arr[j] < arr[j + 1])
            {
                tmp = arr[j];
                arr[j] = arr[j + 1];
                arr[j + 1] = tmp;
            }
        }
    }

    for (i = 0; i < strlen(s); i++)
        printf("%d", arr[i]);

    return 0;
}

좋은 웹페이지 즐겨찾기