양궁대회
프로그래머스
SW개발자를 위한 평가, 교육, 채용까지 Total Solution을 제공하는 개발자 성장을 위한 베이스캠프
programmers.co.kr
난이도 : Level 3
유형 : dfs, 백트래킹
코딩테스트 연습 > 2022 KAKAO BLIND RECRUITMENT > 양궁대회
풀이
라이언이 어피치를 가장 큰 점수 차이로 이기기 위한 n 발의 화살의 경우의 수를 구하는 문제.
근데 가장 큰 점수 차이의 경우의 수가 여러 가지일 경우, 낮은 점수를 더 많이 맞힌 경우가 정답.
각 점수대 마다 라이언이 점수를 가져가냐, 안 가져가냐 둘 중에 하나니까 이걸 그래프로 생각을 해서 dfs로 모든 경우의 수를 보고
가장 큰 점수 차이면서 낮은 점수가 더 많이 맞은 경우를 result에 저장하며 풀었다.
코드
class Solution {
public int maxDiff = 0;
public int[] result = new int[11];
public int[] solution(int n, int[] info) {
int[] ryan = new int[11];
dfs(0, n, ryan, info);
return maxDiff > 0 ? result : new int[]{-1};
}
public void dfs(int idx, int arrows, int[] ryan, int[] apeach) {
if (idx == 11 || arrows == 0) {
ryan[10] += arrows; // 남은 화살은 모두 0점에 추가
int scoreDiff = calDiff(ryan, apeach);
if (scoreDiff > maxDiff) {
maxDiff = scoreDiff;
result = ryan.clone();
} else if (scoreDiff == maxDiff) {
for (int i = 10; i >= 0; i--) {
if (ryan[i] > result[i]) {
result = ryan.clone();
break;
} else if (ryan[i] < result[i]) {
break;
}
}
}
ryan[10] -= arrows; // 백트래킹
return;
}
// 라이언이 해당 점수를 가져가는 경우
if (arrows > apeach[idx]) {
ryan[idx] = apeach[idx] + 1;
dfs(idx + 1, arrows - (apeach[idx] + 1), ryan, apeach);
ryan[idx] = 0; // 백트래킹
}
// 라이언이 해당 점수를 포기하는 경우
dfs(idx + 1, arrows, ryan, apeach);
}
public int calDiff(int[] ryan, int[] apeach) {
int ryanScore = 0, apeachScore = 0;
for (int i = 0; i < 11; i++) {
if (ryan[i] > apeach[i]) {
ryanScore += (10 - i);
} else if (apeach[i] > 0) {
apeachScore += (10 - i);
}
}
return ryanScore - apeachScore;
}
}
'알고리즘공부 > 프로그래머스' 카테고리의 다른 글
[JAVA] 석유 시추 (0) | 2025.02.04 |
---|---|
[JAVA] 붕대 감기 (0) | 2025.02.03 |
[JAVA] 신고 결과 받기 (2) | 2025.02.01 |
[JAVA] k진수에서 소수 개수 구하기 (0) | 2025.02.01 |
[JAVA] 로또의 최고 순위와 최저 순위 (0) | 2025.02.01 |