일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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
- dropout
- lazy propagation
- 우선 순위 큐
- 백트래킹
- 다익스트라
- BFS
- DP
- 가끔은_말로
- 회고록
- 미래는_현재와_과거로
- 조합론
- NEXT
- 너비 우선 탐색
- 세그먼트 트리
- 크루스칼
- 문자열
- 분할 정복
- 2023
- 알고리즘
- c++
- 이분 탐색
- 가끔은 말로
- 플로이드 와샬
- Overfitting
- back propagation
- object detection
- dfs
- tensorflow
- pytorch
- 자바스크립트
Archives
- Today
- Total
Doby's Lab
[C++] 백준 10825번: 국영수, 구조체 선언, 입력 자료형을 무시하지 말자 본문
논리적으로는 쉬운 문제였다. 하지만, 내가 짜 놓은 논리와는 계속 엇나가는 출력이 나와서 1시간 동안 정렬할 때 쓴 compare 함수를 들여다보았지만 문제가 없는 듯했다.
(일부는 내가 원하는 대로 정렬하지만 일부는 논리를 엇나갔었다.)
#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;
bool cmp(vector<string>& a, vector<string>& b) {
if (a[1] != b[1]) {
return a[1] > b[1];
}
else {
if ((a[1] == b[1]) && (a[2] != b[2])) {
return a[2] < b[2];
}
else {
if (((a[1] == b[1]) && (a[2] == b[2])) && (a[3] != b[3])) {
return a[3] > b[3];
}
else {
return a[0] < b[0];
}
}
}
}
int main() {
int n;
cin >> n;
vector<vector<string>> arr(n, vector<string>(4, "index"));
for (int i = 0; i < n; i++) {
string a, b, c, d;
cin >> a >> b >> c >> d;
arr[i][0] = a;
arr[i][1] = b;
arr[i][2] = c;
arr[i][3] = d;
}
sort(arr.begin(), arr.end(), cmp);
for (int i = 0; i < arr.size(); i++) {
cout << arr[i][0] << '\n';
}
return 0;
}
그래서 게시판에서 도움을 얻었다.
https://www.acmicpc.net/board/view/39142
이 분이 나와 비슷한 부분에서 오류를 일으키는 거 같아 읽어보니 다 읽어보지 않아도 문제가 무엇이었는지 알 수 있었다.
이름은 string형에 담은 것이 좋았지만 점수는 그러면 되지 않았다.
(아무래도 잘못된 입력에 따라 다른 메모리를 건든 거 같다.) >> 정확한 근거 아님.
string형이라도 숫자끼리 비교가 가능했었기에 이 부분에 무지함이 있었던 거 같다.
그래서 student라는 구조체를 선언하여 입력에 각각 자료형이 맞도록 입력을 해주었다.
(a = name, b = kor, c = eng, d = math)
#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;
typedef struct {
string a;
int b, c, d;
} student;
bool cmp(student& a, student& b) {
if (a.b != b.b) {
return a.b > b.b;
}
else {
if ((a.b == b.b) && (a.c != b.c)) {
return a.c < b.c;
}
else {
if (((a.b == b.b) && (a.c == b.c)) && (a.d != b.d)) {
return a.d > b.d;
}
else {
return a.a < b.a;
}
}
}
}
int main() {
ios_base::sync_with_stdio(false);
cin.tie(0);
int n;
cin >> n;
vector<student> arr(n);
for (int i = 0; i < n; i++) {
string a;
int b, c, d;
cin >> a >> b >> c >> d;
arr[i].a = a;
arr[i].b = b;
arr[i].c = c;
arr[i].d = d;
}
sort(arr.begin(), arr.end(), cmp);
for (int i = 0; i < arr.size(); i++) {
cout << arr[i].a << '\n';
}
return 0;
}
느낀 점
입력 자료형을 무시하지 말자! 절대!!
728x90
'C++' 카테고리의 다른 글
[자료구조] 우선순위 큐 (Priority Queue) 개념, C++ STL (0) | 2021.10.07 |
---|---|
[C++] 포인터 개념, 백준 1838번: 버블 정렬 (2) (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 |