[C++] 1181: 단어 정렬
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;
}
}