[PCCP 모의고사 1회] #2 - 체육대회
2023. 2. 12. 02:14
문제 접근
이 문제는 모든 케이스를 확인해서 결과를 도출해야하는 완전 탐색 문제이다.
테니스 | 탁구 | 수영 | |
석환 | 40 | 10 | 10 |
영재 | 20 | 5 | 0 |
인용 | 30 | 30 | 30 |
정현 | 70 | 0 | 70 |
준모 | 100 | 100 | 100 |
재귀함수를 통해 DFS로 최대값을 비교해가며 마지막 케이스까지 검증 후 결과를 리턴한다.
코드
import java.lang.Math;
class Solution {
int maxValue = Integer.MIN_VALUE;
int sum = 0;
boolean[] visited;
public int solution(int[][] ability) {
visited = new boolean[ability.length];
process(ability, 0);
return maxValue;
}
private void process(int[][] ability, int abilityIndex) {
// 종목 수만큼 다 조회했을 때 최대값과 비교
if (abilityIndex == ability[0].length) {
maxValue = Math.max(maxValue, sum);
} else {
for (int i=0; i<ability.length; i++) {
// 아직 종목 후보로 이름을 넣지 않은 경우 실행
if (!visited[i]) {
visited[i] = true;
sum += ability[i][abilityIndex];
process(ability, abilityIndex+1);
sum -= ability[i][abilityIndex];
visited[i] = false;
}
}
}
}
}
process 메서드에서 for문이 진행될 때 변수 값들을 표로 정리하면,
테니스(0) | 탁구(1) | 수영(2) | 종목 후보 배열(visited) | 총합 | |
i=0 | 석환 | [true, false, false, false, false] | 40 | ||
i=1 | 석환 | 영재 | [true, true, false, false, false] | 40 + 5 | |
i=2 | 석환 | 영재 | 인용 | [true, true, true, false, false] | 40 + 5 + 30 (최대값 비교) |
i=1 | 석환 | 영재 | [true, true, false, false, false] | 40 + 5 + 30 - 30 | |
i=2 | 석환 | 영재 | 정현 | [true, true, false, true, false] | 40 + 5 + 70 (최대값 비교) |
... | ... | ... | ... | ... | ... |
종목 index 값인 abilityIndex가 3일 때마다 최대값을 비교 후 교체하는 식으로 진행된다.
보완할 점
- 완전 탐색을 통해야만 값을 구할 수 있는지? 순회없이 답을 구할 수 있는 방법이 없는지 다음에 다시 한번 풀어보자.
문제 링크
https://school.programmers.co.kr/learn/courses/15008/lessons/121684
프로그래머스
코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.
programmers.co.kr
'코딩' 카테고리의 다른 글
[백준] 14501. 퇴사 (Java) (0) | 2023.03.12 |
---|---|
[백준] 13458. 시험감독 (Java) (1) | 2023.03.05 |
[PCCP 모의고사 1회] #4 - 운영체제 (0) | 2023.02.12 |
[PCCP 모의고사 1회] #3 - 유전 법칙 (0) | 2023.02.12 |
[PCCP 모의고사 1회] #1 - 외톨이 알파벳 (0) | 2023.02.11 |