본문 바로가기

하루 알고리즘 1문제 풀기

백준 11650번 - 좌표 정렬하기문제 C++

📍 백준 11650번 - 좌표 정렬하기문제 C++


 

🧩 문제 요약

좌표 x,y가 주어질때 x의 오름차순으로 정렬하라. 

단, x가 같은 경우 y의 오름차순으로 정렬. 

 


🧾내가 작성한 초기 코드 

#include <iostream> 
#include <vector> 
#include <algorithm> 
using namespace std; 

bool compare(const vector<int> a, const vector<int> b){
    if(a[0] == b[0]) return a[1] < b[1];
    return a[0] < b[0];
}

int main(){
    int n, i, x, y;
    vector<vector<int>> arr; 
    cin >> n ;
    for(i=0; i<n ; i++){
        cin >> x >> y; 
        arr.push_back({x,y});
    }
    sort(arr.begin(), arr.end(), compare);
    for(i=0; i<n; i++){
        cout << arr[i][0] << " " << arr[i][1] << "\n";
    }
}

 

이 문제를 직관적으로 풀자면 vector + comapre함수로 간단하게 풀 수 있다. 

 

하지만 아래와 같이 vector가 아닌 structure로 해결한 풀이가 있어 살펴보려고 한다. 


👍이 문제에서 배운점

✅ struct(구조체)

구조체(struct) : 하나 이상의 변수를 그룹 지어서 새로운 자료형을 정의. 

구조체는 사용자 정의 자료형으로 객체를 표현하기 위해 하나 이상의 변수가 필요한 경우 많이 사용한다. 

 

struct를 사용하기 전에는 꼭 컴파일러에게 구조체를 선언하고 정의를 해줘야 한다. struct를 사용하는 방법은 다음과 같다. 

 

✔ 구조체 선언 및 정의 (Declaring  and defining structs)

먼저 컴파일러에게 우리가 만들고 싶은 구조체를 알려준다. 

// 컴파일러에 구조체 정의하기 
struct Crew
{
    short id;
    int age;
    string name;
};

 

id, age, name 과 같이 구조체에 속한 변수를 멤버(member) 또는 필드(field)라고 한다. 

일반적으로 구조체 이름은 대문자로 시작해서 변수 이름과 구분한다. 

 

✔ 구조체 타입의 변수 선언

우리가 위에서 정의한 Crew타입의 변수를 선언하면 된다. 

// 구조체 선언
Crew person;

 

✔ 구조체 멤버 접근 

구조체의 멤버에 접근하는 방법은 간단하다. '.'을 사용하면 된다.

person.id = 1; 
person.age = 20;
person.name = "Hello";

 

출력할 때나 값은 불러올때도 마찬가지다. 

cout << person.id ;  // 출력값 1
cout << person.age ;  // 출력값 20
cout << person.name ;  // 출력값 Hello

🧾 완성된 코드

// array를 만들기 위한 구조체 생성
struct coordinate{
	int x, y; 
};

// 구조체 선언 
struct coordinate arr[100001];

bool compare(coordinate a, coordinate y){
	if(a.x==b.x) return a.y< b.y;
    return a.x < b.x; 
}

int main(){
    for(int i = 0; i<n; i++){
    	cin >> arr[i].x >> arr[i].y; 
    }
    
    // 정렬
    sort(arr, arr+n, compare);
    
    // 출력
    for(int i = 0; i<n ; i++){
    	cout <, arr[i].x << " " << arr[i].y << "\n";
    }
}

 

아주 간단하게 구조체에 대해서 알아보았다. 

구조체는 실제로 c++에서 굉장히 많이 사용되는 것 같다. 

백준의 상위 코드만 보더라고 struck을 사용해서 구현하는 코드들이 정말 많았다. 

pair를 사용하는 것 만으로는 한계가 있다고 느껴졌는데 struck를 사용하면 객체 관리가 더 편해질것 같다. 

유용한 개념이니 기억하고 있자!!