본문 바로가기
Programming/C++ - 백준

[백준] 10825번 : 국영수 (C++)

by 지구코드 2024. 3. 14.
반응형

 


문제


풀이

vector에 구조체를 넣어 풀이했다.

 

아래는 array에 구조체를 넣어 풀이한 문제이다.

또한, vector을 이용한 sort 함수와 사용자 지정 compare을 자세히 설명해놓았으니 이 부분이 어렵다면 읽어보시는걸 추천한다!  👍👍

 

 

[백준] 11650번 : 좌표 정렬하기 | Sort 함수와 Compare & Array와 Vector 풀이 (C++)

문제 풀이 '이차원 벡터'와 '이차원 배열'로 풀이했다. 총 세 가지의 풀이로 문제를 해결했다! [ '이차원 벡터' 풀이 ] 1. 이차원 벡터 선언 vector v; // 이차원 벡터 선언 2. 이차원 벡터 요소 입력 for

jigoo-log.tistory.com

 

 

 1. vector를 선언하기 위한 구조체(struct) 생성

 

struct score {	// vector 구조체 생성
	string name;
	int kor, eng, math;
};

 

 2. 구조체 vector 선언

 

	vector<score> v;	// 구조체 vector 선언

 

 

 3. 구조체 이름 설정, 구조체의 각 값에 입력 값 저장 

 

	for (int i = 0; i < N; i++) {
		cin >> n >> k >> e >> m;
		
		score s;	// 구조체의 이름 설정
		s.name = n;		// 구조체의 각 값에 입력받은 값을 저장
		s.kor = k;
		s.eng = e;
		s.math = m;
		
		v.push_back({ s.name, s.kor, s.eng, s.math });		// vector에 붙임
	}

 

 4. 조건에 맞게 정렬

 

 // 사용자 지정 compare
bool compare(score a, score b) {
	if (a.kor == b.kor && a.eng == b.eng && a.math == b.math) {	// 4. 모든 점수가 같으면,
		return a.name < b.name;	// 이름이 사전 순
	}
	else if (a.kor == b.kor && a.eng == b.eng) {	// 3. 국어 점수와 영어 점수가 같으면,
		return a.math > b.math;	// 수학 점수가 감소하는 순서로 (내림차순)
	}
	else if (a.kor == b.kor) {	// 2. 국어 점수가 같으면,
		return a.eng < b.eng;	// 영어 점수가 증가하는 순서로 (오름차순)
	}
	else {
		return a.kor > b.kor;	// 1. 국어 점수가 감소하는 순서로 (내림차순)
	}
}

	sort(v.begin(), v.end(), compare);

 

5. 구조체 vector에서 name 값만 출력

 

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

 

 


 

코드

#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;

struct score {	// vector 구조체 생성
	string name;
	int kor, eng, math;
};

bool compare(score a, score b) {
	if (a.kor == b.kor && a.eng == b.eng && a.math == b.math) {	// 4. 모든 점수가 같으면,
		return a.name < b.name;	// 이름이 사전 순
	}
	else if (a.kor == b.kor && a.eng == b.eng) {	// 3. 국어 점수와 영어 점수가 같으면,
		return a.math > b.math;	// 수학 점수가 감소하는 순서로 (내림차순)
	}
	else if (a.kor == b.kor) {	// 2. 국어 점수가 같으면,
		return a.eng < b.eng;	// 영어 점수가 증가하는 순서로 (오름차순)
	}
	else {
		return a.kor > b.kor;	// 1. 국어 점수가 감소하는 순서로 (내림차순)
	}
}

int main() {
	int N, k, e, m;
	string n;
	vector<score> v;	// 구조체 vector 선언

	cin >> N;

	for (int i = 0; i < N; i++) {
		cin >> n >> k >> e >> m;
		
		score s;	// 구조체의 이름 설정
		s.name = n;		// 구조체의 각 값에 입력받은 값을 저장
		s.kor = k;
		s.eng = e;
		s.math = m;
		
		v.push_back({ s.name, s.kor, s.eng, s.math });		// vector에 붙임
	}

	sort(v.begin(), v.end(), compare);

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

	return 0;
}

 


결과

 

 

 

10825번: 국영수

첫째 줄에 도현이네 반의 학생의 수 N (1 ≤ N ≤ 100,000)이 주어진다. 둘째 줄부터 한 줄에 하나씩 각 학생의 이름, 국어, 영어, 수학 점수가 공백으로 구분해 주어진다. 점수는 1보다 크거나 같고, 1

www.acmicpc.net

 

반응형

댓글