www.acmicpc.net/problem/10825

 

10825번: 국영수

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

www.acmicpc.net

 

1. 풀이방법

 

- algorithm 라이브러리 내에 정의되어있는 sort를 사용하였습니다.

 

 

- 이를 사용한다는 가정하에 cmp함수를 원하는 대로 작성할 수 있는지를 물어보는 문제인 것 같습니다.

 

 

- 조건 그대로 작성해주시면 됩니다.

 

 

- 코드의 길이를 줄일 수 있지만 저는 보통 아래의 코드의 형식을 벗어나게 작성하지는 않습니다.

 

 

- 이 문제처럼 이것만을 물어보기 위한 경우가 아닌 경우 보통 이렇게까지 분류조건이 많이 달리지는 않는데 그랬을 때

  코드 한 두줄 정도 더 길지만 저 같은 경우 의미 파악이 그게 더 분명히 되서 실수할 가능성도 줄고 해서 그대로 작성

  하는 편입니다.

 

 

2. 주의사항

 

 

- 증가순, 감소순 정확히 구별

 

 

 

 

3. 나의코드

 

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

int N;
struct studentscore {
	int kor; int eng; int mat;
	string name;
};
vector<studentscore> studentarr;

bool cmp(studentscore s1, studentscore s2) {
	if (s1.kor > s2.kor) { return true; }
	else if(s1.kor==s2.kor){
		if (s1.eng < s2.eng) return true;
		else if (s1.eng == s2.eng) {
			if (s1.mat > s2.mat) return true;
			else if (s1.mat == s2.mat) {
				if (s1.name< s2.name) return true;
				return false;
			}
			else return false;
		}
		else return false;
	}
	else return false;
}

void inputs() {
	cin >> N;
	for (int i = 0; i < N; i++) {
		studentscore tmps;
		cin >> tmps.name >> tmps.kor >> tmps.eng >> tmps.mat;
		studentarr.push_back(tmps);
	}
}
int main() {
	ios_base::sync_with_stdio(false);
	cin.tie(NULL); cout.tie(NULL);
	inputs();
	sort(studentarr.begin(), studentarr.end(), cmp);
	for (int i = 0; i < studentarr.size(); i++) {
		cout << studentarr[i].name << "\n";
	}
	return 0;
}

'알고리즘 문제풀이 > 정렬' 카테고리의 다른 글

백준 1620 [C++]  (0) 2021.01.09
백준 2887 [C++]  (0) 2020.10.27
백준 10814  (0) 2020.03.02
백준 1181  (0) 2020.01.15
백준 1427  (0) 2020.01.08

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

 

10814번: 나이순 정렬

온라인 저지에 가입한 사람들의 나이와 이름이 가입한 순서대로 주어진다. 이때, 회원들을 나이가 증가하는 순으로, 나이가 같으면 먼저 가입한 사람이 앞에 오는 순서로 정렬하는 프로그램을 작성하시오.

www.acmicpc.net

- 문제에서 요구하는 정렬 조건만 잘 맞춰주면 되는 간단한 문제 !.

 

- 저는 vector 배열에 age와name을 저장하는 구조체에 whenin 이라는 언제 가입했는지(가입순서)

 

- 를 초기화 하는 과정에서 i를 넣어놓았고 정렬을 하는 과정에서 나이가 같으면 whenin을 비교하여 정렬하도록 하였습니다.

 

<코드>

'알고리즘 문제풀이 > 정렬' 카테고리의 다른 글

백준 1620 [C++]  (0) 2021.01.09
백준 2887 [C++]  (0) 2020.10.27
백준 10825 [C++]  (0) 2020.10.25
백준 1181  (0) 2020.01.15
백준 1427  (0) 2020.01.08

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

 

1946번: 신입 사원

첫째 줄에는 테스트 케이스의 개수 T(1 ≤ T ≤ 20)가 주어진다. 각 테스트 케이스의 첫째 줄에 지원자의 숫자 N(1 ≤ N ≤ 100,000)이 주어진다. 둘째 줄부터 N개 줄에는 각각의 지원자의 서류심사 성적, 면접 성적의 순위가 공백을 사이에 두고 한 줄에 주어진다. 두 성적 순위는 모두 1위부터 N위까지 동석차 없이 결정된다고 가정한다.

www.acmicpc.net

1. 첫 번째는 입력은 순위 입니다(점수가 아님)  --조심 !

 

2. 전 첫번째 제출한 코드는 시간초과가 되었습니다. 당연한 것이 최악의경우를 생각해보면

 

   입력을 고려해 보았을 떄 10000000000 이는 약 1억번 연산이 1초라고 계산해보면

 

   당연히 시간초과가 나올 수 밖에 없겠죠.

 

3. 그래서 우선 서류점수로 오름차순 정렬을 한후

   

   반복문을 돌리는데 이때는 전체를 다 탐색할 필요가 없이 본인보다 서류점수 우선순위가 높은 사람들

    (즉 본인보다 낮은 index)

   의 면접점수만 확인 하면 되기 때문에 입력이 커질경우 연산 횟수를 대폭 줄일 수 있습니다.

 

** 그리고 저 같은 경우 vector를 사용하였는데 시간적 측면에서 더 단축 하고 싶다면

    그냥 max값을 define 하여 그만큼의 배열을 잡아 버리는 것이 시간적 측면에서는 더 이득인 것 같더라구요 !

 

<시간초과 코드>

 

<맞춘 코드>

 

'알고리즘 문제풀이 > 그리디' 카테고리의 다른 글

백준 1138  (0) 2020.02.28
백준 1049  (0) 2020.02.23
백준 1120  (0) 2020.02.23
백준 1541  (0) 2020.02.20
백준 2875  (0) 2020.02.11

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

 

1931번: 회의실배정

(1,4), (5,7), (8,11), (12,14) 를 이용할 수 있다.

www.acmicpc.net

회의실 배정에 관한 문제이다.

 

그리디 알고리즘 에 해당하는 문제이다

 

(기준은 끝나는 시간!) 빨리 끝내고 다른 회의를 최대한 넣어야 하기 때문이다. 이는 조금만 생각해도 알수 있었다.

 

하지만 처음짠 코드에서 채점 87%정도에서 틀렸습니다 ! 를 많이 보았는데

 

내가 고려하지 않은 반례가 테스트케이스에 있다는 것이였는데... 찾는데 꽤 오래걸렸다.

 

그것은 바로 끝나는 시간만을 기준으로 정렬을 했기 때문 이였다.

 

예를 들면 시작/끝이 3/3 3/3 1/3 같은 경우 회의 3개를 진행할 수 있는 것인데

 

조건에서 파악하여 앞에 두개 3/3 3/3은 카운트 할 수 있었으나

 

3/3을 해버리면 currenttime을 3으로 바꾸어 버리기 때문에 1/3이 카운트 되지 않는다.

 

즉 끝나는 시간이 같다면 시작시간이 먼저인것을 앞에 두게 정렬을 하여야 한다.

 

<필기>

 

<코드>

 

 

'알고리즘 문제풀이 > 그리디' 카테고리의 다른 글

백준 2875  (0) 2020.02.11
백준 10610  (0) 2020.02.10
백준 2217  (0) 2020.02.10
백준 11047  (0) 2020.02.05
백준 11399  (0) 2020.02.05

+ Recent posts