computer_study

[정렬] BAEKJOON ' 10814'번 '나이순 정렬 '문제 (C++/python) 본문

알고리즘/문제풀이

[정렬] BAEKJOON ' 10814'번 '나이순 정렬 '문제 (C++/python)

knowable 2020. 8. 7. 01:55

문제 : www.acmicpc.net/problem/10814

 

10814번: 나이순 정렬

온라인 저지에 가입한 사람들의 나이와 이름이 가입한 순서대로 주어진다. 이때, 회원들을 나이가 증가하는 순으로, 나이가 같으면 먼저 가입한 사람이 앞에 오는 순서로 정렬하는 프로그램을 �

www.acmicpc.net

 

 

  • 문제 해결 아이디어

    1.   각 언어의 sort stl의 특성을 이용한다.

 

 

  • python

    python에선 sort함수로, list를 특정 인자로 정렬을 한다고 지정 시, 나머지 인자들은 원래 list 순서대로 유지한다는 특징을 이용한다.

    ex) (2,4),(2,3),(1,5) 를 첫번째 인자를 기준으로 정렬한다면 (1,5),(2,4),(2,3)이 된다.

 

n = int(input())

array = []

for _ in range(n):
    input_data = input().split(' ')
    array.append(int(input_data[0]),input_data[1])

array = sorted(array, key=lambda x: x[0]) # 나이순으로 정렬되도록 key값 설
# 이후 나머지 원소에 대해서 stable하다.(원래 list의 순서를 최대한 유지한다.)->python 정렬 library의 특성

for i in array:
    print(i[0], i[1])

# python 정렬
# sort() 함수를 이용해서 list를 바로 정렬
#   ex) list.sort()
# sorted() 함수에 list를 매개변수로 넣어서 정렬, 이후 정렬된 결과를 반환한다.
#   ex) sorted(list)

 

 

  • c++

vector를 sort함수로 정렬 시. 앞부분부터 차례로 정렬하는 특성을 이용한다.

ex) (2,4),(2,3),(1,5) 를 sort함수로 정렬할 시, (1,5)(2,3)(2,4)가 된다.

이는 python에서, "특정 인자로 정렬"을 지정하지 않을 시 같은 특성을 갖는다.(아래 11650문제)

#include "iostream"
#include "string"
#include "vector"
#include "algorithm"

using namespace std;


int main(){
    
    int num_of_member,index=0;
    vector<pair<pair<int,int>,string>> v;
    
    scanf("%d",&num_of_member);
    
    for(int i=0 ; i< num_of_member ; i++){
        char name_tmp[100];
        int age;
        
        scanf("%d",&age);
        scanf("%s",name_tmp);
        
        v.push_back(make_pair(make_pair(age, index),name_tmp));
        index++;
    }
    
    sort(v.begin(), v.end());
    
    for(int i=0 ; i< num_of_member ; i++){
        printf("%d %s\n",v[i].first.first, v[i].second.c_str());
    }
    return 0;
}

 

같은 맥락의 문제로 '좌표 정렬하기'가 있다.

 

www.acmicpc.net/problem/11650

 

11650번: 좌표 정렬하기

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

www.acmicpc.net

 

  • python

n = int(input())

array = []

for _ in range(n):
    x, y = map(int, input().split(' '))
    array.append(((x,y)))

array = sorted(array) # key값 없이 정렬하면 자동으로 앞에서부터 정렬

for i in array:
    print(i[0], i[1])

 

 

  • c++

#include "iostream"
#include "vector"
#include "algorithm"

using namespace std;

int main(){
    
    int num_of_points;
    vector<pair<int,int>> v;
    
    scanf("%d",&num_of_points);
    
    for(int i=0 ; i< num_of_points ; i++){
        int a,b;
        scanf("%d%d",&a,&b);
        
        v.push_back(make_pair(a,b));
    }
    
    sort(v.begin(), v.end());
    
    for(int i=0 ; i< num_of_points ; i++){
        printf("%d %d\n",v[i].first,v[i].second);
    }

    return 0;
}
Comments