Notice
Recent Posts
Recent Comments
Link
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | |||
5 | 6 | 7 | 8 | 9 | 10 | 11 |
12 | 13 | 14 | 15 | 16 | 17 | 18 |
19 | 20 | 21 | 22 | 23 | 24 | 25 |
26 | 27 | 28 | 29 | 30 | 31 |
Tags
- 코어자바스크립트
- JS스터디
- React.StrictMode
- 이중지도
- Lv2
- 타겟넘버
- 알고리즘 문제풀이
- 백준 알고리즘
- div2개
- 스택
- 두원사이의정수쌍
- 2023카카오블라인드코테
- pccp기출문제
- 과제진행하기
- 알고리즘문제풀이
- [pccp 기출문제]
- c++
- JS
- 우박수열정적분
- solved.ac골드
- DP
- Lv3
- 프로그래머스
- solved.ac플래티넘
- 백준알고리즘
- 지도 여러개
- 5강클로저
- 최소스패닝트리
- 비트마스크
- 정렬
Archives
- Today
- Total
호지
[프로그래머스] 인사고과 문제풀이 c++ 본문
문제를 읽고 풀이과정에 대해 고민했습니다.
1단계 근무태도 점수(a)와 동료 평가 점수(b)를 보고 인센티브를 받지 못하는 경우를 거른다.
2단계 근무태도 점수(a)와 동료 평가 점수(b)의 합을 보고 등수를 나눈다.
1단계와 2단계의 과정을 거치면 원하는 답을 구할 수 있을 것이라 생각했고,
정렬된 데이터가 필요할 것이라고 생각했습니다.
1단계에서는 a기준으로 정렬하고, b기준으로 정렬을 2번하는 방법을 생각했으나,
2번의 정렬과정을 불필요해보였습니다.
그래서 a기준으로 내림차순 정렬을 하고
a값이 동일할 때는 b기준으로 오름차순 정렬을 했습니다.
정렬된 리스트에서 처음 값을 기준으로 삼고,
다음 원소가 a값과 b값 모두 작은 경우라면 해당 원소를 [-1, -1]로 초기화 했습니다.
(인센티브를 받지 못하는 경우)
이때, 해당 값이 완호의 점수라면 완호가 인센티브를 받지 못하는 경우이므로 -1를 return 합니다.
a값과 b값 모두 작은 경우가 아니라면, 그 위치에 해당하는 값을 기준으로 다시 삼았습니다.
위 과정을 완료하면 인센티브를 받지 못하는 사원은 [-1, -1]라는 점수를 갖고 있습니다.
a+b의 합을 기준으로 다시 scores 리스트를 정렬하고
원호의 등수를 구하면 원하는 결과를 구할 수 있습니다.
동석차를 구분하기 위해 same_prize라는 변수를 사용했습니다.
#include <string>
#include <vector>
#include <algorithm>
using namespace std;
bool cmp1(vector<int> &v1, vector<int> &v2){
if(v1[0] == v2[0])
return v1[1] < v2[1];
return v1[0] > v2[0];
}
bool cmp2(vector<int> &v1, vector<int> &v2){
return v1[0]+v1[1] < v2[0] + v2[1];
}
int solution(vector<vector<int>> scores) {
int wanho_score1 = scores[0][0], wanho_score2 = scores[0][1];
sort(scores.begin(), scores.end(), cmp1);
int s1 = scores[0][0], s2 = scores[0][1];
for(int i=0; i<scores.size(); i++){
if(s1 > scores[i][0] && s2 > scores[i][1]){
if(scores[i][0] == wanho_score1 && scores[i][1] == wanho_score2)
return -1;
scores[i][0] = -1;
scores[i][1] = -1;
}
else{
s1 = scores[i][0];
s2 = scores[i][1];
}
}
sort(scores.begin(), scores.end(), cmp2);
int prize = 0, same_prize = 1, sum = 200001;
for(int i=scores.size()-1; i >=0; i--){
if(sum > scores[i][0] + scores[i][1]){
sum = scores[i][0] + scores[i][1];
prize += same_prize;
same_prize = 1;
}
else
same_prize++;
if(scores[i][0] == wanho_score1 && scores[i][1] == wanho_score2)
return prize;
}
}
https://school.programmers.co.kr/learn/courses/30/lessons/152995#
'알고리즘 > 프로그래머스' 카테고리의 다른 글
[프로그래머스] 표 병합 c++ (0) | 2023.04.06 |
---|---|
[프로그래머스] 표현 가능한 이진트리 c++ (0) | 2023.04.04 |
[프로그래머스] 연속 펄스 부분 수열의 합 c++ (0) | 2023.03.31 |
[프로그래머스] 리코쳇 로봇 c++ (0) | 2023.03.30 |
[프로그래머스] 전화번호 목록 문제풀이 c++ (0) | 2022.04.14 |
Comments