PS

[C++] 1181: 단어 정렬

왕방토 2023. 2. 2. 09:01
728x90

solved.ac에서 class 2 필수문제들 다시 풀어보자! 하다가

발견한 문제인데

 

C++을 쓰면서 scanf/printf를 사용하는 나같은 사람에게는

조금 까다로울 수 있는 문제라서 다시 풀어봤다

 

이 문제를 푸는 방법은 여러가지가 있겠지만,

우선 포인트는

 

1. 두가지 우선순위 조건이 있는 정렬

2. 중복 제거

*3. char* <-> string 의 변환

 

이 있다(3번은 string을 사용하면서 입출력은 scanf/printf 로 처리하면서 해결해줘야 하는 추가적인 문제)

 

우선, 1번은 다음과 같이

<algorithm> 헤더의 sort 함수를 이용하면서

따로 compare 함수를 조건에 맞게 만들어주면 된다

#include <algorithm>
using namespace std;

bool cmp(const string &s1, const string &s2) {
	if (s1.length() == s2.length()) return s1 < s2;
	return s1.length() < s2.length();
}
...
sort(v.begin(), v.end(), cmp);

 

다음 2번은, set 또는 unordered_map, map 등 해결법이 많겠지만

나는 총 입력의 크기가 2만개로 크지 않고, 정렬한 후에 처리할 수도 있다는 특성을 이용하여

입력을 받을때 처리하는 것이 아닌, 정렬한 후에 처리하는 식으로 해결하였다.

string before = "";
sort(v.begin(), v.end(), cmp);
for (int i = 0; i < v.size(); i++) {
    string s = v[i];
    strcpy(str, s.c_str());
    if (i != 0 && before == s) continue;
    printf("%s\n", str);
    before = s;
}

 

3번은 위의 코드에서도 볼 수 있지만, strcpy를 이용하여 string->char*로,

string 생성자를 이용하여 char*->string 으로 변환해 줄 수 있다.

 

*자세한 내용은 -> https://ddingji.tistory.com/97

 

[C++] char[] to string, string to char[] / char[], char* 의 차이점

이젠 머릿속에 넣읍시다 에잇 char[] to string 생성자 사용 char str_char[10] = "lemonade"; string str(str_char); 또는 string str=""; str=str_char; 해주면 대입연산자가 알아서 str_char의 주소값부터 시작해 '\0'까지 읽

ddingji.tistory.com

char str[51];
scanf("%s", str);
string s(str);
...
strcpy(str, s.c_str());

 

 

따라서 전체 코드는 다음과 같다

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

bool cmp(const string &s1, const string &s2) {
	if (s1.length() == s2.length()) return s1 < s2;
	return s1.length() < s2.length();
}

int main() {
	int N;
	scanf("%d", &N);
	char str[51];
	vector<string> v;
	while (N--) {
		scanf("%s", str);
		string s(str);
		v.push_back(s);
	}

	string before = "";
	sort(v.begin(), v.end(), cmp);
	for (int i = 0; i < v.size(); i++) {
		string s = v[i];
		strcpy(str, s.c_str());
		if (i != 0 && before == s) continue;
		printf("%s\n", str);
		before = s;
	}
}
댓글수1