https://school.programmers.co.kr/learn/courses/30/lessons/152995
- 출처 : 프로그래머스 코딩 테스트 연습
프로그래머스
코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.
programmers.co.kr
[문제 요약]
- 각 사원마다 근무 태도 점수와 동료 평가 점수가 기록되어 있는데 만약 어떤 사원이 다른 임의의 사원보다 두 점수가 모두 낮은 경우가 한 번이라도 있다면 그 사원은 인센티브를 받지 못합니다.
- 그렇지 않은 사원들에 대해서는 두 점수의 합이 높은 순으로 석차를 내어 석차에 따라 인센티브가 차등 지급됩니다.
- 이때, 두 점수의 합이 동일한 사원들은 동석차이며, 동석차의 수만큼 다음 석차는 건너 뜁니다. 예를 들어 점수의 합이 가장 큰 사원이 2명이라면 1등이 2명이고 2등 없이 다음 석차는 3등부터입니다.
- 각 사원의 근무 태도 점수와 동료 평가 점수 목록 scores이 주어졌을 때, 완호의 석차를 return 하도록 solution 함수를 완성해주세요.
[문제 조건]
- 1 ≤ scores의 길이 ≤ 100,000
- scores의 각 행은 한 사원의 근무 태도 점수와 동료 평가 점수를 나타내며 [a, b] 형태입니다.
- scores[0]은 완호의 점수입니다.
- 0 ≤ a, b ≤ 100,000
- 완호가 인센티브를 받지 못하는 경우 -1을 return 합니다.
[문제 풀이]
먼저 필자는 주어지는 scores의 배열을 첫 번째 원소를 기준으로 오름차순 정렬을 한 뒤 인센티브를 받을 수 있는 사원을 추려냈다.
추려내는 방법은 첫 번째 원소가 다를 때 두 번째 원소의 크기가 작은 사원은 배제하고, 그렇지 않은 사원들만 따로 모았다.
for(int i=0; i<tmp.size(); i++)
{
bool flag = true;
for(int j=i+1; j<tmp.size(); j++)
{
if(tmp[j].first.first == tmp[i].first.first) continue;
else
{
if(tmp[i].first.second < tmp[j].first.second)
{
flag=false; break;
}
}
}
if(flag) tmp2.push_back(tmp[i]);
}
위의 코드에서 tmp배열은 scores 배열을 { { 근무태토 점수, 동료평가 점수 } , 인덱스 } 형태로 가공하고 정렬한 상태의 배열이다.
tmp2 배열은 tmp배열에서 인센티브를 받을 수 있는 사원들만 추가시킨 배열이다.
사원을 추려낸 뒤 다시 tmp2배열을 두 점수의 합을 기준으로 오름차순으로 정렬한 뒤 순위를 매겼다.
[소스 코드]
#include <string>
#include <vector>
#include <iostream>
#include <algorithm>
#define pii pair<int,int>
using namespace std;
bool cmp(pair<pii,int> &a, pair<pii,int> &b)
{
if(a.first.first == b.first.first) return a.first.second < b.first.second;
else return a.first.first < b.first.first;
}
bool cmp2(pair<pii,int> &a, pair<pii,int> &b)
{
return (a.first.first+a.first.second) > (b.first.first+b.first.second);
}
int solution(vector<vector<int>> scores) {
int answer = -1;
vector<pair<pii,int>> tmp;
vector<pair<pii,int>> tmp2;
for(int i=0; i<scores.size(); i++)
{
tmp.push_back({{scores[i][0], scores[i][1]}, i});
}
sort(tmp.begin(), tmp.end(), cmp);
for(int i=0; i<tmp.size(); i++)
{
bool flag = true;
for(int j=i+1; j<tmp.size(); j++)
{
if(tmp[j].first.first == tmp[i].first.first) continue;
else
{
if(tmp[i].first.second < tmp[j].first.second)
{
flag=false; break;
}
}
}
if(flag) tmp2.push_back(tmp[i]);
}
sort(tmp2.begin(), tmp2.end(), cmp2);
int sum = tmp2[0].first.first + tmp2[0].first.second;
int cnt = 1;
int cur_rank = 1;
if(tmp2[0].second == 0) return 1;
for(int i=1; i<tmp2.size(); i++)
{
if(sum == (tmp2[i].first.first + tmp2[i].first.second)) cnt++;
else
{
cur_rank += cnt;
cnt=1;
sum = tmp2[i].first.first + tmp2[i].first.second;
}
if(tmp2[i].second == 0) answer = cur_rank;
}
return answer;
}
레벨3 문제치고는 쉬운 문제였다.

굳
'프로그래머스' 카테고리의 다른 글
[프로그래머스/Level 2/C++] 시소 짝꿍 (0) | 2023.01.27 |
---|---|
[프로그래머스/Level 3/C++] 억억단을 외우자 (0) | 2023.01.20 |
[프로그래머스/Level 2/C++/월간 코드 챌린지 시즌3] 빛의 경로 사이클 (0) | 2023.01.19 |
[프로그래머스/Level 3/C++/월간 코드 챌린지 시즌2] 모두 0으로 만들기 (0) | 2023.01.18 |
[프로그래머스/Level 3/C++/Summer,Winter Coding] 스티커 모으기(2) (0) | 2023.01.16 |