홍시홍의 프로그래밍

[백준 11650] 좌표 정렬하기 본문

알고리즘 문제풀이/백준

[백준 11650] 좌표 정렬하기

홍시홍 2020. 1. 9. 21:43

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

 

11650번: 좌표 정렬하기

첫째 줄에 점의 개수 N (1 ≤ N ≤ 100,000)이 주어진다. 둘째 줄부터 N개의 줄에는 i번점의 위치 xi와 yi가 주어진다. (-100,000 ≤ xi, yi ≤ 100,000) 좌표는 항상 정수이고, 위치가 같은 두 점은 없다.

www.acmicpc.net

1/7일 문제

 

요구사항

좌표 정렬하기

1. x 오름차순

2. y 오름차순

 

풀이

머지 소트로 정렬하기

 

#include <stdio.h>
#include <algorithm>
#include <iostream>

using namespace std;
 
const int PN = 23;
const int HASH_SIZE = 10000;


struct go{
    int x;
    int y;
};
go map[100001];
go buf[100001];

int n;
/*
void qasort(int arr[], int left, int right){
    if(left>=right){
        return;
    }
    int i = left;
    int j = right;
    int pivot = arr[(left+right)/2];

    while(i<=j){
        while(arr[i]<pivot){
            i++;
        }
        while(arr[j]>pivot){
            j--;
        }
        if(i<=j){
            int temp=arr[i];
            arr[i]=arr[j];
            arr[j]=temp;
            i++;
            j--;
        }
    }
    qasort(arr,left,j);
    qasort(arr,i,right);
}
*/
/*
void merge_sort(int arr[], int len){
    
    if(len<2)
        return;
    int i,j,mid,k;
    mid = len/2;
    i=0;
    k=0;
    j=mid;

    merge_sort(arr,mid);
    merge_sort((arr+mid),(len-mid));

    while(i<mid && j<len){
        if(arr[i]<arr[j]){
            buf[k++]=arr[i++];
        }
        else{
            buf[k++]=arr[j++];
        }
    }

    while(i<mid){
        buf[k++]=arr[i++];
    }

    while(j<mid){
        buf[k++]=arr[j++];
    }

    for(int i =0 ; i <len ; i++){
        arr[i]=buf[i];
    }
}
*/
void merge_sort(go arr[], int len)
{
    if(len<2){
        return;
    }
    int i,j,k,mid;
    mid=len/2;
    i=0;
    j=mid;
    k=0;
    merge_sort(arr,mid);
    merge_sort((arr+mid),(len-mid));
    while(i<mid && j<len){
        if(arr[i].x <arr[j].x){
            buf[k++]=arr[i++];
        }
        else if(arr[i].x == arr[j].x){
            if(arr[i].y <= arr[j].y){
                buf[k++] = arr[i++];
            }
            else{
                buf[k++]=arr[j++];
            }
        }
        else{
            buf[k++]=arr[j++];
        }
    }

    while(i<mid){
        buf[k++]=arr[i++];
    }

    while(j<len){
        buf[k++]=arr[j++];
    }
    for(int a =0 ; a < len ; a++){
        arr[a]=buf[a];
    }

}
/*
void qasort(go arr[], int left, int right){
    if(left>=right)
        return;
    int i = left;
    int j = right;
    go pivot= arr[(left+right)/2];

    while(i<=j){
        while(arr[i].size < pivot.size){
            i++;
        }
        
        while(arr[j].size > pivot.size){
            j--;
        }
        if(arr[i].size == arr[j].size){
            for(int k=0 ; k<arr[i].size ; k++){
                if(arr[i].ch[j] > arr[j].ch[j]){

                }
                else{

                }
            }
        }
        if(i<=j){
            go temp;
            temp=arr[i];
            arr[i]=arr[j];
            arr[j]=temp;
            i++;
            j--;
        }
    }
    qasort(arr,left,j);
    qasort(arr,i,right);
}
void merge_sort(go arr[], int len){
    if(len<2){
        return;
    }
    int i,j,mid,k;
    mid=len/2;
    i=0;
    j=mid;
    k=0;
    merge_sort(arr,mid);
    merge_sort((arr+mid),(len-mid));

    while(i<mid && j <len){
        
        if(arr[i].size < arr[j].size){
            buf[k++]=arr[i++];
        }
        
        else if(arr[i].size == arr[j].size){
          //  cout<<arr[i].size<<endl;
            int flag=0;
            for(int len=0 ; len<arr[i].size ; len++){
         //       cout<<arr[i].ch[len]<<" "<<arr[j].ch[len]<<endl;
                if(arr[i].ch[len] < arr[j].ch[len]){
                    buf[k++]=arr[i++];
                    flag=1;
                    break;;
                }
                else if(arr[i].ch[len] > arr[j].ch[len]){
                    buf[k++]=arr[j++];
                    flag=1;
                    break;;
                }
            }
            if(flag==1)
                continue;
            else{
                buf[k++]=arr[i++];}

        }
        else{
            buf[k++]=arr[j++];
        }
    }

    while(i<mid){
        buf[k++]=arr[i++];
    }

    while(j<len){
        buf[k++]=arr[j++];
    }

    for(int k=0 ; k <len ; k++){
        arr[k]=buf[k];
    }

}
int strcmp(char a[], char b[])
{
    int i=0;
    int j=0;
    while(a[i]){
        if(a[i++] != b[j++]){
            i--,j--;
            break;
        }
    }
    return a[i]-b[j];
}
*/
int main(){
 //   cout<<"A"<<endl;
    scanf("%d",&n);
    for(int i=0 ; i <n;i++){
        scanf("%d%d",&map[i].x,&map[i].y);
    }
    merge_sort(map,n);
  //  cout<<endl;
    for(int i=0 ; i < n ; i++){
        printf("%d %d\n",map[i].x,map[i].y);
    }
   // cout<<"AAAAAAAAA"<<endl;
}

'알고리즘 문제풀이 > 백준' 카테고리의 다른 글

[백준 11004] k번째 수  (0) 2020.01.09
[백준 11651]좌표 정렬하기2  (0) 2020.01.09
[백준 1181] 단어 정렬  (0) 2020.01.09
[백준 2887] 행성 터널  (0) 2020.01.09
[백준 9938] 방 청소  (0) 2020.01.09
Comments