국영수

YoungJae·2022년 7월 14일
0

Boj

목록 보기
11/14

문제

https://www.acmicpc.net/problem/10825

참고

https://yeolco.tistory.com/29
https://chanhuiseok.github.io/posts/algo-37/
https://choryeonworkshop.tistory.com/119
https://ldgeao99.tistory.com/220

해당 문제는 N명의 학생 성적을 주어진 조건에 따라 정렬 후 각 학생의 이름만 출력하는 문제이다.

문제의 조건을 포함하는 구조체 선언과 sort 함수의 대소 비교를 위해 연산자 오버로딩을 잘 작성하면 크게 어려움 없이 구현할 수 있었다.
다만, 풀이 과정에서 문자열에 익숙하지 않았던 점이 한가지 문제점으로 작용했다.

사실 헤더파일을 입력할때 무의식적으로 string을 같이 선언하긴 하지만, 위의 문제를 풀기 전까지 string을 다루는게 익숙하지 않았다.

특히, 학생의 성적을 정렬하는 기준에서 모든 점수가 같은 경우 이름이 사전 순으로 증가하는 순서대로 정렬을 할때 각 string 객체들의 0번째 성분을 직접 비교를 하기도 했다.
(주의! char 형식의 배열이든 sting 형식의 배열이든 서로 성분을 비교하면 각 문자가 저장된 주소를 비교하기 때문에 원하는 비교를 할 수 없음)

위의 링크를 정리한 내용은 따로 작성할 계획이지만, 해당 문제를 풀기 위해 필요한 결정적인 내용은, string은 문자열 간에 대소비교를 지원한다는 것이었다.
즉, 문자열 간에 >, <을 사용해서 오름차순 혹은 내림차순 정렬을 할 수 있다.

위의 내용을 정리한 전체 코드는 다음과 같다.

#define _CRT_SECURE_NO_WARNINGS
#include <iostream>
#include <string>
#include <algorithm>
#include <vector>
#include <stack>
#include <queue>
#include <map>
using namespace std;

struct sce {
	string name;
	int kor, eng, math;

	sce(string n, int a, int b, int c) {
		name = n;
		kor = a;
		eng = b;
		math = c;
	}

	bool operator< (const sce& b) const {
		if (kor != b.kor) {
			return kor > b.kor;
		}

		if (eng != b.eng) {
			return eng < b.eng;
		}

		if (math != b.math) {
			return math > b.math;
		}

		else {
			return name < b.name;
		}
	}
};

int main() {
	ios_base::sync_with_stdio(false);
	//freopen("input.txt", "rt", stdin);

	string k;
	int n, a, b, c;

	cin >> n;
	vector<sce> student;

	for (int i = 0; i < n; i++) {
		cin >> k >> a >> b >> c;
		student.push_back(sce(k, a, b, c));
	}

	sort(student.begin(), student.end());

	for (int i = 0; i < n; i++) {
		cout << student[i].name << "\n";
	}

	return 0;
}
profile
코딩테스트 넘어서기

0개의 댓글