프로그래머스
코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.
programmers.co.kr
- i점에서 라이언이 어피치보다 1발 더 맞춰야 라이언이 득점
- 2발 더 맞춰도 얻는 점수는 같기에 어피치보다 2발 이상 맞추는건 낭비
- 가장 큰 점수 차로 이기는게 여러가지면, 가장 낮은 점수를 더 많이 맞춘 경우를 리턴 > 각 점수마다 위를 반복한 후 남은 화살을 전부 0점에서 소모
- 위를 조건으로 화살 명중 조합을 만들고 각 조합마다 점수를 계산해서 점수차가 가장 큰 경우와 해당 경우가 2개 이상일 시 0점에서 소모된 화살이 더 많은 경우를 리턴
- 점수가 어피치보다 낮으면 -1 리턴
#include <string>
#include <vector>
using namespace std;
// 완전탐색 필요 > dfs 사용
int bestDiff = -1, RyanScore = 0, ApeachScore = 0;
vector<int> score, ryan, apeach, ryanBest;
void checkCondition() {
int diff = RyanScore - ApeachScore;
// ryan의 점수에서 apeach의 점수를 뺀 값이 0이하면 ryan이 이긴 것이 아님
if(diff <= 0) return;
// ryan이 이겼다면
else {
// 현재 최고점하고 diff가 같다면
if(bestDiff == diff) {
// 가장 낮은 점수를 더 많이 맞힌 경우 구하기
// 가장 낮은 점수를 맞춘 수가 동일하다면 그 다음으로 낮은 점수로 넘어가야함
for(int i = 10; i >= 0; i--) {
// ryan이 0이 아니고 ryanBest가 0인 경우
if(ryan[i] != 0 && ryanBest[i] == 0) {
ryanBest = ryan;
break;
}
// ryan이 0이고 ryanBest는 0이 아닌 경우
else if(ryan[i] == 0 && ryanBest[i] != 0)
break;
// 둘의 값이 0이 아니면 비교 필요
else if(ryan[i] != 0 && ryanBest[i] != 0) {
// 둘의 값이 다르면
if(ryan[i] != ryanBest[i]) {
// ryan이 ryanResult보다 크면
if(ryan[i] > ryanBest[i]) {
// 점수차는 같으나 배열 갱신 필요
ryanBest = ryan;
break;
}
}
}
}
}
// 현재 최고점보다 ryanScore가 크거나 갱신된 적이 없다면
else if(diff > bestDiff || bestDiff == -1) {
// 갱신
bestDiff = diff;
ryanBest = ryan;
}
}
}
// 점수 계산
void calcScore() {
int ryanScore = 0;
int apeachScore = 0;
for(int i = 0; i < 11; i++) {
// i 배점에서 ryan과 apeach가 맞힌 개수가 동일하면
if(ryan[i] == apeach[i]) {
// ryan과 apeach 둘 다 i 점을 맞추지 않았을 때
if(ryan[i] == 0 && apeach[i] == 0)
continue;
else
apeachScore += 10 - i;
}
// 맞힌 개수가 동일하지 않을 때
else {
// 라이언이 어피치보다 많이 맞췄으면 라이언 점수 증가
if(ryan[i] > apeach[i])
ryanScore += 10 - i;
// 아니면 어피치 점수 증가
else
apeachScore += 10 - i;
}
}
// 라이언 점수
RyanScore = ryanScore;
// 어피치 점수
ApeachScore = apeachScore;
}
void dfs(int cnt, int i, int n) {
// 화살을 전부 사용했으면
if(cnt == n) {
// 계산
calcScore();
// 조건 체크
checkCondition();
return;
}
int remain = n - cnt;
// 가장 큰 점수 차이로 우승하는 방법이 여러가지면, 가장 낮은 점수를 더 많이 맞춰야함
// 2번째 조건을 위해 i == 10에서 남은 화살이 있으면 전부 소모해야함
if(i == 10) {
ryan[i] = remain;
dfs(cnt + remain, i + 1, n);
ryan[i] = 0;
}
// i == 10이 아닐 때
else {
// 남은 화살 수가 apeach[i]보다 크거나 같으면
if(apeach[i] + 1 <= remain) {
// apeach[i] + 1을 ryan[i]에 삽입
ryan[i] = apeach[i] + 1;
dfs(cnt + ryan[i], i + 1, n);
ryan[i] = 0;
}
dfs(cnt, i + 1, n);
}
}
vector<int> solution(int n, vector<int> info) {
score.resize(2, 0);
ryan.resize(11, 0);
apeach = info;
dfs(0, 0, n);
// bestDiff가 갱신된적 없다면 이기는 경우가 없음 > -1 리턴
if(bestDiff == -1) ryanBest.push_back(-1);
return ryanBest;
}
'프로그래머스 > 2레벨' 카테고리의 다른 글
[프로그래머스/C++] 이모티콘 할인행사 (0) | 2024.03.19 |
---|---|
[프로그래머스/C++] 순위 검색 (0) | 2024.03.14 |
[프로그래머스/C++] 택배 배달과 수거하기 (0) | 2024.03.12 |
[프로그래머스/C++] 혼자서 하는 틱택토 (1) | 2024.03.12 |
[프로그래머스/C++] 단체사진 찍기 (0) | 2024.03.12 |