알고리즘 모음(C++)

백준 1181 - 단어 정렬 본문

백준

백준 1181 - 단어 정렬

공대생의 잡다한 사전 2021. 6. 25. 17:14

문제 링크입니다 https://www.acmicpc.net/problem/1181

 

1181번: 단어 정렬

첫째 줄에 단어의 개수 N이 주어진다. (1 ≤ N ≤ 20,000) 둘째 줄부터 N개의 줄에 걸쳐 알파벳 소문자로 이루어진 단어가 한 줄에 하나씩 주어진다. 주어지는 문자열의 길이는 50을 넘지 않는다.

www.acmicpc.net

 

입력된 단어를 정렬하는 문제입니다. 

 

cmp라는 함수를 사용해서 길이, 사전순으로 정렬을 하는 방식으로 풀었습니다.

정렬을 다한 후에는 출력 for문에서 같은 문자를 제외하고 출력했습니다.

 

cmp함수에서 첫번째로 length를 이용해 길이를 비교합니다.  길이가 다르다면 올바른 return 값을 해주면 됩니다. 만약 길이가 같다면 단어를 사전 순으로 비교해서 올바른 return 값을 해줍니다.

 

입력 부분에서 같은 문자를 제외하지 않았기에 출력부분에서 확인을 해줘야합니다. 정렬을 한 뒤에 맨 처음 문자를 string 변수를 이용해서 받습니다. 그 후에 만약 변수와 값이 같다면 출력하지 않고 변수와 값이 다르다면 출력을 하는 방식으로 만들었습니다.

 

#define _CRT_SECURE_NO_WARNINGS
#include <iostream>
#include <cstdio>
#include <algorithm>
#include <cstring>
#include <queue>
#include <vector>
#include <cmath>

using namespace std;

int number;

bool cmp(string a, string b) {
	if (a.length() < b.length()) {
		return true;
	}
	else if (a.length() == b.length()) {
		if (a < b) {
			return true;
		}
		else if (a > b) {
			return false;
		}
	}
	return false;
}

int main() {
	cin.tie(0);
	cout.tie(0);
	vector<string> word;
	cin >> number;
	for (int i = 0; i < number; i++) {
		string a;
		cin >> a;
		word.push_back(a);
	}
	sort(word.begin(), word.end(), cmp);
	string word_first = word[0];
	cout << word[0] << "\n";
	for (int i = 1; i < word.size(); i++) {
		if (word_first == word[i]) {
			continue;
		}
		if (word_first != word[i]) {
			cout << word[i] << "\n";
			word_first = word[i];
		}
	}
	return 0;
}

 

질문 및 조언 댓글 남겨주세요!

'백준' 카테고리의 다른 글

백준 9935 - 문자열 폭발(복습)  (0) 2021.06.28
백준 1043 - 거짓말  (0) 2021.06.28
백준 2294 - 동전 2  (0) 2021.06.25
백준 9465 - 스티커  (0) 2021.06.24
백준 7576 - 토마토  (0) 2021.06.24