반응형
문제
풀이
'구조체를 이용한 벡터'로 풀이했다.
비슷한 정렬 문제 풀이를 아래에 첨부한다. 아래는 vector에 구조체를 넣어 같은 방식으로 풀이한 정렬 문제이다.
array에 구조체를 넣어 풀이한 정렬 문제이다.
또한, vector을 이용한 sort 함수와 사용자 지정 compare을 자세히 설명해놓았으니 이 부분이 어렵다면 읽어보는걸 추천한다! 👍👍
1. vector를 선언하기 위한 구조체(struct) 생성
struct serial { // vector 구조체 생성
string str;
int jarisu = 0, length = 0;
};
2. 구조체 vector 선언
vector<serial> v; // 구조체 vector 선언
3. 구조체 이름 설정, 구조체의 각 값에 입력 값 저장
자릿수를 구해서 저장하는게 중요!
for (int i = 0; i < n; i++) {
cin >> s;
l = s.length();
serial code; // 구조체의 이름 설정
code.str = s; // 구조체의 각 값에 입력받은 값 저장
code.length = l;
for (int k = 0; k < s.length(); k++) { // 아스키코드 이용해서 자릿수 구하고 저장
if (0 <= (s[k] - 48) && (s[k] - 48) <= 9) {
j += (s[k] - 48);
}
}
code.jarisu = j;
j = 0; // 꼭 자릿수 초기화시켜줘야 함
v.push_back({ code.str, code.jarisu, code.length }); // vector에 붙임
}
4. 조건에 맞게 정렬
// 사용자 지정 compare
bool compare(serial a, serial b) { // (주의) a.str 뒤에 괄호 없음
if (a.length == b.length && a.jarisu == b.jarisu) { // 3. 길이와 자릿수가 모두 같다면,
return a.str < b.str; // 사전 순대로(아스키코드 순)
}
else if (a.length == b.length) { // 2. 길이만 같다면,
return a.jarisu < b.jarisu; // 자릿수를 오름차순으로
}
else {
return a.length < b.length; // 1. 길이 순으로
}
}
sort(v.begin(), v.end(), compare);
5. 구조체 vector에서 str 값만 출력
for (int i = 0; i < n; i++) {
cout << v[i].str << "\n";
}
코드
#include <iostream>
#include <string>
#include <vector>
#include <algorithm>
using namespace std;
struct serial { // vector 구조체 생성
string str;
int jarisu = 0, length = 0;
};
// 사용자 지정 compare
bool compare(serial a, serial b) { // (주의) a.str 뒤에 괄호 없음
if (a.length == b.length && a.jarisu == b.jarisu) { // 3. 길이와 자릿수가 모두 같다면,
return a.str < b.str; // 사전 순대로(아스키코드 순)
}
else if (a.length == b.length) { // 2. 길이만 같다면,
return a.jarisu < b.jarisu; // 자릿수를 오름차순으로
}
else {
return a.length < b.length; // 1. 길이 순으로
}
}
int main() {
int n, j = 0, l;
string s;
vector<serial> v; // 구조체 vector 선언
cin >> n;
for (int i = 0; i < n; i++) {
cin >> s;
l = s.length();
serial code; // 구조체의 이름 설정
code.str = s; // 구조체의 각 값에 입력받은 값 저장
code.length = l;
for (int k = 0; k < s.length(); k++) { // 아스키코드 이용해서 자릿수 구하고 저장
if (0 <= (s[k] - 48) && (s[k] - 48) <= 9) {
j += (s[k] - 48);
}
}
code.jarisu = j;
j = 0; // 꼭 자릿수 초기화시켜줘야 함
v.push_back({ code.str, code.jarisu, code.length }); // vector에 붙임
// cout << v[i].str << " " << v[i].jarisu << " " << v[i].length << "\n"; // 출력 확인용 코드
}
sort(v.begin(), v.end(), compare);
for (int i = 0; i < n; i++) {
cout << v[i].str << "\n";
}
return 0;
}
결과
반응형
'Programming > C++ - 백준' 카테고리의 다른 글
[백준] 1920번 : 수 찾기 | binary search (C++) (0) | 2024.04.01 |
---|---|
[백준] C++로 풀이 시 시간 초과가 난다면? (0) | 2024.03.28 |
[백준] 11656번 : 접미사 배열 | string.substr() 함수를 이용한 '부분 문자열 추출' (C++) (0) | 2024.03.14 |
[백준] 10825번 : 국영수 (C++) (2) | 2024.03.14 |
[백준] 11650번 : 좌표 정렬하기 | Sort 함수와 Compare & Array와 Vector 풀이 (C++) (0) | 2024.03.14 |
댓글