본문 바로가기
개발/알고리즘 풀이...

[백준] 1946번 문제

by p_human 2021. 3. 10.

www.acmicpc.net/problem/1946

 

1946번: 신입 사원

첫째 줄에는 테스트 케이스의 개수 T(1 ≤ T ≤ 20)가 주어진다. 각 테스트 케이스의 첫째 줄에 지원자의 숫자 N(1 ≤ N ≤ 100,000)이 주어진다. 둘째 줄부터 N개 줄에는 각각의 지원자의 서류심사 성

www.acmicpc.net

하... 이 문제 푸는데 3시간 걸렸당.. ㅎ(알고리즘 포기할까..)

정렬까지는 했는데 좀 더 핵심이 되는 간단한 코드를 생각하지 못해서 2시간을 허비했던 것 같다.

분명 로프 문제와 거의 똑같은 문제였는데, 왜 생각하지 못했을까. 정말 나는 빡대가리

문제를 푸는데 1시간이 걸리면 안된다는 소리가 있었지만, 이번에는 오기가 생겨서 될때까지 하다가 지쳐서 결국 답을 봐버렸다.

다만, 답을 봤을 때 정말 감탄이 나왔다. 나는 O(n^2)이 걸렸는데, 답에는 O(n)의 시간 복잡도로 해결을 한 것이다. 참...

 

먼저 문제를 보자마자 멍했다. 문제를 계속 봤다. 10분정도? 그제서야 이해가 됬다. 아 각 사원들의 서류, 면접 성적의 순위가 주어질 때 합격할 수 있는 사원이 몇 명인지 구하는 문제라는 것

그렇다면 이걸 어떻게 구해야 할까?

먼저 벡터를 이용하자는 생각을 했다. 그리고 클래스를 만들어서 int형 변수 2개를 선언해서 각각 서류, 면접의 등수로 사용을 하고 서류의 등수를 기준으로 먼저 정렬을 한 뒤에 지지고 볶자라는 생각이 들었다.

여기까지는 좋았으나 그 정렬한 값을 가만히 냅두지를 못하고 활용하자는 생각에 갇혀서 헤어나오지를 못했다. 그래서 결국에는 시간초과가 뜨고, 컴파일 에러에 각양각색의 오류가 떴다.

 

나의 풀이

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

class Employee {
public:
	int num1;
	int num2;
	bool operator <(const Employee& e1)
	{
		return (num1 < e1.num1);
	}
	Employee(int n1, int n2) : num1(n1), num2(n2) {}
};

int main()
{
	int n;
	cin >> n;
	for (int i = 0; i < n; i++) {
		int t, num1, num2, res = 0;
		vector<Employee> v;
		cin >> t;
		for (int j = 0; j < t; j++) {
			cin >> num1 >> num2;
			v.push_back(Employee(num1, num2));
		}
		sort(v.begin(), v.end());
		for (int j = 1; j < t; j++) {
			bool failed = false;
			for (int k = 0; k <= j; k++) {
				if (v[j].num2 > v[k].num2) {
					failed = true;
					break;
				}
				failed = false;
			}
			if (!failed) res++;
		}
		cout << ++res << "\n";
	}
}

이렇게 풀면 안된다. ㅜㅜ

 

다른 사람 풀이 + 나의 생각 아주 조금...

#include <iostream>
#include <climits>
#include <vector>
#include <algorithm>
using namespace std;
int main()
{
	int n;
	cin >> n;
	for (int i = 0; i < n; i++) {
		int t, num1, num2, res = 0;
		// 각 사원의 등수를 저장하기 위한 벡터
		vector<pair<int, int>> v;
		cin >> t;
		for (int j = 0; j < t; j++) {
			cin >> num1 >> num2;
			v.push_back({ num1, num2 });
		}
		// 정렬
		sort(v.begin(), v.end());
		int min = INT_MAX;
		for (int j = 0; j < t; j++) {
			if (min > v[j].second) {
				min = v[j].second;
				res++;
			}
		}
		cout << res << "\n";
	}
}

이렇게 풀어야지 암... 그렇고 말고

훨씬 간결하고 코드의 가독성도 좋다.

 

'개발 > 알고리즘 풀이...' 카테고리의 다른 글

[백준] 1181번 문제 풀이  (0) 2021.03.13
[백준] 4796번 문제 풀이  (0) 2021.03.12
[백준] 2217번 문제  (0) 2021.03.09
[백준] 11052번 문제 풀이  (0) 2021.03.05
[백준] 1316 풀이  (0) 2020.06.05