백준 - 20299번(3대 측정)

최지홍·2022년 2월 14일
0

백준

목록 보기
55/145

문제 출처: https://www.acmicpc.net/problem/20299


문제

  • 웨이트 트레이닝에서의 3대 측정은 스쿼트, 벤치프레스, 데드리프트의 중량을 측정하는 것이다. 하지만 세 명이 한 팀을 이루어 출전하는 전국 대학생 프로그래밍 대회(ICPC)의 참가자들은 다소 독특한 방법으로 3대를 측정하는데, 바로 팀원 각각의 실력을 수치로 나타내 주는 ‘코드포스 레이팅’을 비교하는 것이다.

  • 웨이트 트레이닝계에는 3대 중량을 합쳐 500kg를 넘지 못하는 사람은 ‘언더아머’ 브랜드의 옷을 입지 못한다는 암묵적인 룰이 있으며. 이들을 단속하는 ‘언더아머 단속반’이 존재한다는 소문도 있다. Sogang ICPC Team은 이를 벤치마킹해 팀원 3명의 코드포스 레이팅의 합이 KK 미만인 팀은 가입할 수 없는 VIP 클럽을 만들고자 한다.

  • 하지만 이런 조건에서는 세 명 중 한 명의 레이팅이 현저히 낮더라도 나머지 두 명의 레이팅이 충분히 높다면 세 명이 모두 VIP 클럽에 가입할 수 있게 된다. 클럽에 가입하는 사람들은 모두 일정 수준 이상이어야겠다고 판단한 학회장 임지환은 모든 팀원의 레이팅이 L\boldsymbol{L} 이상이고, 팀원 세 명의 레이팅의 합이 K\boldsymbol{K} 이상인 팀만이 가입할 수 있게 하였다.

  • 학회 일과 연합 일에 치여 사는 지환이는 VIP 클럽의 회원 관리까지 할 시간이 없다. 지환이를 위해 지원자 중 VIP 클럽에 가입할 수 있는 팀의 수를 구하고, VIP 회원들의 레이팅을 출력해 보자.


import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.util.StringTokenizer;

public class Main {

    public static void main(String[] args) throws Exception {
        // 입력을 얻기 위한 reader
        BufferedReader reader = new BufferedReader(new InputStreamReader(System.in));
        StringBuilder sb = new StringBuilder(); // 출력값 저장용
        StringTokenizer tokenizer = new StringTokenizer(reader.readLine()); // StringTokenizer 설정
        int N = Integer.parseInt(tokenizer.nextToken()); // 신청한 동아리의 수
        int S = Integer.parseInt(tokenizer.nextToken()); // 팀원 3명의 능력 합에 대한 VIP클럽 가입조건
        int M = Integer.parseInt(tokenizer.nextToken()); // 개인 능력치에 대한 VIP클럽 가입조건

        int count = 0; // 가입이 가능한 동아리의 수

        while (N-- > 0) { // 신청한 동아리의 수만큼 반복한다.
            tokenizer = new StringTokenizer(reader.readLine()); // StringTokenizer 설정
            int[] members = new int[3]; // 동아리원들의 능력을 담기 위한 배열
            int sum = 0; // 동아리원들의 능력을 합산하기 위한 변수
            boolean isAccept = true; // VIP클럽 가입 승낙 여부. true -> 허용
            for (int i = 0; i < members.length; i++) {
                members[i] = Integer.parseInt(tokenizer.nextToken()); // 동아리원들의 점수 가져오기
                if (members[i] < M) { // 만약 한명이라도 동아리원이 기준점 M을 넘지 못하면
                    isAccept = false; // VIP클럽에 들어갈 수 없다.
                    break; // 반복 종료
                }
                sum += members[i]; // 기준점 M을 통과한 동아리원들의 능력 합을 저장한다.
            }

            // 개인 기준점 M은 통과했으나 전체 기준점 S를 넘지 못한 경우 VIP클럽 가입이 거부된다.
            if (isAccept && sum < S) isAccept = false;

            if (isAccept) { // 모든 조건을 충족한 경우
                count++; // VIP클럽에 가입한 동아리 횟수 증가
                for (int i = 0; i < members.length; i++) {
                    sb.append(members[i]).append(" "); // VIP클럽에 가입한 동아리원들의 점수 저장
                }
            }
        }

        System.out.println(count + "\n" + sb); // 최종 출력
    }

}

  • 조건을 잘 정리하면 쉽게 풀 수 있는 문제였다.
profile
백엔드 개발자가 되자!

0개의 댓글