[C言語]水平11650:座標位置合わせ



構想

  • 残念そうなのでx[i]とy[i]を並べ替えておけばいいのですが、
  • を選んで並べ替えます
  • ダメなら快速ソートを考えるべき、
  • 解読を開始したばかりのコード(タイムアウト)

    #include <stdio.h>
    
    int main()
    {
        int n,i,j;
        scanf("%d", &n);
        int x[n], y[n];
        i = 0;
        while(i < n)
        {
            scanf("%d %d", &x[i], &y[i]);
            i++;
        }
        i = 0;
        while(i < n - 1)
        {
            j = i + 1;
            while(j < n)
            {
                if(x[i] >= x[j] && y[i] >= y[j])
                {
                    int temp;
                    temp = x[i];
                    x[i] = x[j];
                    x[j] = temp;
                    temp = y[i];
                    y[i] = y[j];
                    y[j] = temp;
                }
                j++;
            }
            i++;
        }
        i = 0;
        while(i < n)
        {
            printf("%d %d\n",x[i], y[i]);
            i++;
        }
    }

    構想


    タイムアウトしました.クイックソートの使用を検討します.でも問題があった
    1.急速なソートを直接実現するには、私の今の実力はまだ足りない.では、内蔵関数を使用するべきで、qsortは1つの配列しか含まれていません.compareも2つの値だけを比較します.
    2.しかし、私たちが望んでいるのはx座標だけでなく、y座標も考えなければなりません.比較ではx==x 1ではy座標を考える方法が思いつかない.
    3.最終的にグーグルのポスト構造体を使う方法を見つけた.
  • 構造体を用いることで,以上の問題はすべて解決した.
  • 変更後
    #include <stdio.h>
    #include <stdlib.h>
    
    typedef struct
    {
        int x;
        int y;
    } coord; //coord형의 구조체 선언
    
    int compare(const void *a, const void *b)
    {
        coord A = *(coord *)a; //coord형의 A로 입력받은 a를 사용할 수 있게한다.
        coord B = *(coord *)b;
        if (A.x > B.x) // 구조체의 x를 끌고와서 사용한다. 오름차순 정렬
            return 1;
        else if (A.x == B.x) // x좌표가 같다면,
        {
            if (A.y > B.y) // y좌표를 비교한다. 오름차순 정렬
                return 1;
            else
                return -1; // 그게 아니라면 -1반환.
        }
        return -1; // A.x < B.x면 -1
    }
    
    int main()
    {
        int n, i;
        scanf("%d", &n);
        i = 0;
        coord arr[n]; // 구조체형으로 배열을 선언한다.
        while (i < n)
        {
            scanf("%d %d", &arr[i].x, &arr[i].y);
            // 구조체배열로 arr[0]의 x값,y값 각각 설정하면서 간다.
            i++;
        }
        qsort(arr, n, sizeof(coord), compare); // 퀵정렬 사용
        i = 0;
        while (i < n)
        {
            printf("%d %d\n", arr[i].x, arr[i].y); // 정렬된 배열 출력
            i++;
        }
    }
    今回は本当に勉強になりました私は構造体なのか、なぜ使うのか、なぜtypedefを使うのか、ただ待っていて、私はとても喜んでいます.
    なぜhttps://dojang.io/mod/page/view.php?id=409 typedefを使うのか
    https://sedangdang.tistory.com/16コードコメントサイト
    https://velog.io/@inwooleeme/%EB%B0%B1%EC%A4%80-%EC%95%8C%EA%B3%A0%EB%A6%AC%EC%A6%98-11650%EB%B2%88-%EC%A2%8C%ED%91%9C-%EC%A0%95%EB%A0%AC%ED%95%98%EA%B8%B0コードリファレンスサイト2<-ここからたくさん学びました
    https://modoocode.com/55構造体の概念整理.