본문 바로가기

Programming/BOJ

[백준/C++] 1181번: 단어정렬

풀이방향

1. string vector를 만든다.

2. 문장들을 입력받으면서 문장의 길이에 해당하는 배열 index에 갯수 추가 (이 과정을 통해 문장길이가 같은 애들끼리만 사전순 정렬가능)

3. 문장 길이순 정렬

4. while문을 돌면서 vector 내부에서 문장길이마다 사전순 정렬

5. 출력 시 바로 앞 문장과 같다면 출력을 하지 않는 식으로 중복없이 출력 

 

왜 틀렸나 계속 고민하고 있었는데 while문 종료조건을 50으로 했다. 그럼 길이가 50인 문장은 처리를 못하잖아...^^ 오래 고민해서 슬프다. 그래도 문자열 관련 공부하기 좋은 문제!

 

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

int cnt[52] = { 0 };
vector<string> v;;
bool comp(string s1, string s2) {
	//return (s1.compare(s2) <0);

	return s1 < s2;
}


bool comp_length(string s1, string s2) {
	return s1.size() < s2.size();
}


int main() {

	int N; cin >> N;
	for (int i = 0; i < N; i++) {
		string tmp;
		cin >> tmp;
		int length = tmp.size();
		cnt[length]++;
		v.push_back(tmp);
	}

	//문자 갯수 작은 순으로 sort
	sort(v.begin(), v.end(), comp_length);



	//문자 갯수대로 sort하기
	int num = 1;
	int start = 0;
	int end = 0;
	while (1) {

		if (num == 51)break;
		if (cnt[num] != 0) {


			end += cnt[num] - 1;
			//cout << "현재 몇글자애 하는 지:" << num << "(" << start << "," << end << ")" << endl;
			sort(v.begin() + start, v.begin() + end+1, comp);
			/*
			for (int i = start; i <= end; i++) {
				cout << v[i] << endl;
			}
			*/


			start = end + 1;
			end = start;
			
		}
		num++;
		
	}



	for (int i = 0; i < v.size(); i++) {
		if (i == 0)  cout << v[i] << endl;
		else {
			if (v[i] != v[i - 1]) cout << v[i] << endl;
		}
	}
	

	
	return 0;
}  

 

더 쉽게 풀 수 있네..삽질했다.

 

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

vector<string> v;;
bool comp_length(string s1, string s2) {
	if (s1.size() == s2.size()) return s1 < s2;
	else return s1.size() < s2.size();
}

int main() {

	int N; cin >> N;
	for (int i = 0; i < N; i++) {
		string tmp;
		cin >> tmp;
		v.push_back(tmp);
	}

	//문자 갯수 작은 순으로 sort
	sort(v.begin(), v.end(), comp_length);

	v.erase(unique(v.begin(), v.end()),v.end());
	for (int i = 0; i < v.size(); i++) {
		cout << v[i] << endl;
	}



	return 0;
}