일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | |||
5 | 6 | 7 | 8 | 9 | 10 | 11 |
12 | 13 | 14 | 15 | 16 | 17 | 18 |
19 | 20 | 21 | 22 | 23 | 24 | 25 |
26 | 27 | 28 | 29 | 30 | 31 |
Tags
- dfs
- 세그먼트 트리
- 분할 정복
- 크루스칼
- 문자열
- 가끔은_말로
- Overfitting
- BFS
- NEXT
- lazy propagation
- 미래는_현재와_과거로
- 이분 탐색
- 2023
- 알고리즘
- back propagation
- object detection
- 자바스크립트
- 백트래킹
- 가끔은 말로
- 조합론
- c++
- tensorflow
- pytorch
- 너비 우선 탐색
- 다익스트라
- 우선 순위 큐
- 플로이드 와샬
- 회고록
- DP
- dropout
Archives
- Today
- Total
Doby's Lab
[C++] 백준 1181번: 단어 정렬 (sort의 optional function) 본문
이 문제가 요구하는 바는 다음과 같다.
- 길이가 짧은 것부터 정렬
- 길이가 같으면 사전 순으로
- 중복을 허용하지 않음
#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;
bool compare(string a, string b) {// 정렬 기준 함수 (optional function)
return a.size() < b.size();
}
int main() {
// 입력
int T;
cin >> T;
vector<string> idx;
for (int i = 0; i < T; i++) {
string sample;
cin >> sample;
idx.push_back(sample);
}
//크기가 작은 순으로 정렬
sort(idx.begin(), idx.end(), compare);
/*
크기가 같을 때 사전순으로 정렬할 코드
*/
//출력
for (int i = 0; i < T; i++) {
cout << idx[i] << '\n';
}
return 0;
}
크기가 같을 때 사전순으로 정렬할 코드를 고민하다가
compare에서 option을 더 추가할 수는 없을까를 생각했다.
bool compare(string a, string b) {
if (a.size() != b.size()) {
return a.size() < b.size();
}
else {
return a < b;
}
}
기존의 compare에서는 크기만 비교할 수 있게 했다면
크기가 다를 때는 크키별로 정렬하고, 같을 때는 사전순으로 정렬할 수 있게 해주었다.
결론적으로 이 문제에서 얻을 수 있었던 것은
sort의 optional function을 통해 조건을 더 추가할 수 있었다는 점이다.
정답
+여담
중복을 허용하지 않는다는 조건에서 어떻게 vector의 중복을 처리할 수 있을까
여러 방법을 생각하다가 stack을 하나 선언에서 기존에 vector의 데이터를 가져오자라는 생각을 했는데
(기존의 자료와 동일하다면 push할 때 전의 것을 pop을 하는 형태로)
출력에서 stack이 에러가 났었다.
Q: stack은 인덱스 번호를 매길 수 없을까?
> 답을 아신다면 댓글을 남겨주세요😂😂
(+ 2021-11-05 추가내용
첫 문제풀이 포스팅이었네😮😮
오랜만에 예전 포스팅들 보다가 질문에 대한 답을 적는다.
A: 스택은 인덱스 번호 못 매긴다.
)
#include <iostream>
#include <vector>
#include <algorithm>
#include <stack>
using namespace std;
bool compare(string a, string b) {
if (a.size() != b.size()) {
return a.size() < b.size();
}
else {
return a < b;
}
}
int main() {
int T;
cin >> T;
vector<string> idx;
for (int i = 0; i < T; i++) {
string sample;
cin >> sample;
idx.push_back(sample);
}
sort(idx.begin(), idx.end(), compare);
for (int i = 0; i < T; i++) {
if (i == T - 1) {
cout << idx[i] << '\n';
continue;
}
if (idx[i] == idx[i + 1]) {
continue;
}
else {
cout << idx[i] << '\n';
}
}
return 0;
}
결론적으로 출력할 때, 출력하자마자 즉각적으로 중복을 처리하게끔 조건을 걸어주었다.
중복을 처리하는 부분이 주관적으로 난잡하다는 생각이 든다.
Q2: 중복을 처리할 때 더 깔끔하게 할 수 있는 방법이 있을까요??
728x90
'C++' 카테고리의 다른 글
[C++] 포인터 개념, 백준 1838번: 버블 정렬 (2) (0) | 2021.10.01 |
---|---|
[C++] 백준 10825번: 국영수, 구조체 선언, 입력 자료형을 무시하지 말자 (0) | 2021.10.01 |
[C++] 백준 1431번: 시리얼 번호, sort에서 더 깊게 파고든 compare (0) | 2021.09.28 |
[C++] 백준 1152번: 단어의 개수, 문자열 입력(getline(),cin.get(), cin.getline(), cin.ignore()) (0) | 2021.09.03 |
[C++] 소수점 자리 설정, cout.precision(), fixed (0) | 2021.09.02 |