[프로그래머스/JAVA] PCCP 모의고사 1회 2번 체육대회

황인찬·2024년 9월 7일
0
post-thumbnail

[프로그래머스/PCCP] 체육대회

https://school.programmers.co.kr/learn/courses/15008/lessons/121684

문제 설명📖

당신이 다니는 학교는 매년 체육대회를 합니다. 체육대회는 여러 종목에 대해 각 반의 해당 종목 대표가 1명씩 나와 대결을 하며, 한 학생은 최대 한개의 종목 대표만 할 수 있습니다. 당신의 반에서도 한 종목당 1명의 대표를 뽑으려고 합니다. 학생들마다 각 종목에 대한 능력이 다르지만 이 능력은 수치화되어 있어 미리 알 수 있습니다. 당신의 반의 전략은 각 종목 대표의 해당 종목에 대한 능력치의 합을 최대화하는 것입니다.

다음은 당신의 반 학생이 5명이고, 종목의 개수가 3개이며, 각 종목에 대한 학생들의 능력치가 아래 표와 같을 때, 각 종목의 대표를 뽑는 예시입니다.

테니스 대표로 준모, 탁구 대표로 인용, 수영 대표로 정현을 뽑는다면, 세 명의 각 종목에 대한 능력치의 합은 200(=100+30+70)이 됩니다.
하지만, 테니스 대표로 석환, 탁구 대표로 준모, 수영 대표로 정현을 뽑는다면 세 명의 각 종목에 대한 능력치 합은 210(=40+100+70)이 됩니다. 이 경우가 당신의 반의 각 종목 대표의 능력치 합이 최대가 되는 경우입니다.

당신의 반 학생들의 각 종목에 대한 능력치를 나타내는 2차원 정수 배열 ability가 주어졌을 때, 선발된 대표들의 해당 종목에 대한 능력치 합의 최대값을 return 하는 solution 함수를 완성하시오.

제한사항🚫

  • 1 ≤ ability의 행의 길이 = 학생 수 ≤ 10
  • 1 ≤ ability의 열의 길이 = 종목 수 ≤ ability의 행의 길이
  • 0 ≤ ability[i][j] ≤ 10,000
    • ability[i][j]는 i+1번 학생의 j+1번 종목에 대한 능력치를 의미합니다.

입출력 예

입출력 예 설명
입출력 예 #1

  • 문제 예시와 같습니다.

입출력 예 #2

  • 1번 학생이 2번 종목을, 2번 학생이 1번 종목의 대표로 참가하는 경우에 대표들의 해당 종목에 대한 능력치의 합이 최대가 되며, 이는 60입니다.

포인트💡

  • dfs를 이용하여 풀이
    • depth(선택 된 학생 수)와 종목 수가 같을 시 최대값 비교 후 종료
    • 반복문을 통해 처음 방문일 시 방문 체크 후 dfs 호출
    • 다시 방문 해제

풀이💡

class Solution {
    static int visited[];
    static int max, stuCnt, subCnt;
    
    static void dfs(int depth, int sum, int ability[][]){
        if(depth == subCnt){
            max = Math.max(max, sum);
            return;
        }
        for(int i=0; i<stuCnt; i++){
            if(visited[i] == 0){
                //방문처리
                visited[i] = 1;
                dfs(depth+1, sum + ability[i][depth], ability);
                visited[i] = 0;
            }
        }
    }
    public int solution(int[][] ability) {
        //학생 수, 종목 수 초기화
        stuCnt = ability.length;
        subCnt = ability[0].length;
        visited = new int[stuCnt];
        
        dfs(0, 0, ability);
        return max;
    }
}
profile
찬이's 개발로그

0개의 댓글