본문 바로가기
Programming/Algorithm

백준 단어 정렬

by OKOK 2018. 1. 26.

백준 단어 정렬하는데 2가지 씨스타일 2가지가 있습니다. 그럼 2가지 방법에서 한번 풀어보도록 하겠습니다. 단어 정렬2가지를 해보도록 하겠습니다.  


#include <iostream>

#include <algorithm>

#include <vector>

#include <ctime>

#include <functional>


using namespace std;


void Print(vector<int> &v) {

cout << "vector : ";

for (int i = 0; i < 10; i++) {

cout << v[i] << " ";

}

cout << endl;

}


int main(void) {

srand((int)time(NULL));

vector<int> v;

int n = 10;

for (int i = 0; i < n; i++) {

v.push_back(rand() % 10);

}

Print(v);


sort(v.begin(), v.end(), greater<int>());

Print(v);


return 0;


/*

compare 함수 사용하는 것을 보니, 일관적이고, 이게 단어 솔팅하도록 나온 것 같습니다.

이것에 대해서 익숙하게 사용하면 되겠습니다. 벡터와 동적할당 중에서 어떤 것들이

더욱 익숙할지 한번 더 적어보고 기록하도록 하겠습니다.

*/


#include <iostream>

#include <algorithm>

#include <vector>

#include <ctime>

#include <string>


using namespace std;


class Student {

public:

string name;

int age;

Student(string name, int age):name(name), age(age){}

};


void Print(vector<Student> &v) {

cout << "Student : ";

for (int i = 0; i < 5; i++) {

cout << "[" << v[i].name << ", " << v[i].age << "]";

}

cout << endl;

}


bool compare(Student a, Student b) {

if (a.name == b.name) {

return a.age < b.age;

}

else {

return a.name < b.name;

}

}


int main(void) {

vector<Student> v;

v.push_back(Student("cc", 10));

v.push_back(Student("ba", 24));

v.push_back(Student("aa", 11));

v.push_back(Student("cc", 8));

v.push_back(Student("bb", 21));


Print(v);

sort(v.begin(), v.end(), compare);

Print(v);


return 0;

}


 


정렬문제를 풀다보니, 숫자가 아닌 받은 알파벳에 대한 정렬을 하는 문제가 나옴. 이것에 대해서 필요한 헤더파일으 알고리즘과 벡터 그리고 스트링이빈다. 먼저 클래스를 생성해줍니다. 구조체와 같습니다. 퍼블릭으로 해서 모두 사용할 수 있도록 열어 둔 것 입니다. 그리고 생성합니다. 그리고 벡터 클래스를 데이터 형태를 불러와서 사용하는 것은 주소를 불러서 하는 것입니다. 이렇게 이름과 나이에 대해서 출력을 합니다. 


그 다음으로 비교하는 함수를 보면, 데이터 형태 2개를 받은 다음에 만약에 하나씩 비교를 합니다. 이름이 같다면 나이에 대해서 비교를 하고 리턴을 하고 이름이 같지 않다면 이름을 사전순으로 정렬하시오 와 같은 의미입니다. 오케이요. 순서 < > 이렇게 하는 것이구나. 


다음으로 벡터 스튜던트 브이름 넣어줍니다. 그리고 소트를 할때 컴패어를 뒤에 넣어줍니다. 이것을 기반으로 문제로 돌아가서 다시 한번 보도록 하겠습니다. 


#include <iostream>

#include <algorithm>

#include <string>


using namespace std;


bool cmp(const string &a, const string &b) {

if (a.length() == b.length)

return a < b;

return a.length() < b.length();

}


int main() {

int n;

string a[20001];

cin >> n;

for (int i = 1; i <= n; i++)

cin >> a[i];

sort(a + 1, a + n + 1, cmp);

for (int i = 1; i <= n; i++) {

if (a[i] != a[i + 1])

cout << a[i] << endl;

}

return 0;

}


와 진짜 간단하게 풀이했네요. 스트링 배열을 만들어서 왜 이렇게 생각을 못했을까요. 엔터도 먹는다고 생각을 했는데, 그것은 geline 을 사용할때 입니다. 오케이요. 그럼 일단 스트링을 이렇게 맘껏 만들어두고 사용해보겠습니다. 그리고 진짜 간단하게 풀었네. 스트링에 대해서 완전하게 이해하고 있네요. 스트링의 사이즈와 렝쓰는 동일한것인가? 네 동일합니다.