프로그래머스/Lv. 0(코딩 기초 트레이닝)

[프로그래머스 코딩테스트] 전국 대회 선발 고사(Java)

Sigfriede 2023. 7. 11. 01:00

  문제 설명

  0번부터 n - 1번까지 n명의 학생 중 3명을 선발하는 전국 대회 선발 고사를 보았습니다. 등수가 높은 3명을 선발해야 하지만, 개인 사정으로 전국 대회에 참여하지 못하는 학생들이 있어 참여가 가능한 학생 중 등수가 높은 3명을 선발하기로 했습니다.

  각 학생들의 선발 고사 등수를 담은 정수 배열 rank와 전국 대회 참여 가능 여부가 담긴 boolean 배열 attendance가 매개변수로 주어집니다. 전국 대회에 선발된 학생 번호들을 등수가 높은 순서대로 각각 a, b, c번이라고 할 때 10000 * a + 100 * b + c를 return 하는 solution 함수를 작성해 주세요.

 

  제한사항

  • 3 <= rank의 길이 = attendance의 길이 <= 100
  • rank[i]는 i번 학생의 선발 고사 등수를 의미합니다.
  • rank의 원소는 1부터 n까지의 정수로 모두 서로 다릅니다.
  • attendance[i]는 i번 학생의 전국 대회 참석 가능 여부를 나타냅니다.
    • attendance[i]가 true라면 참석 가능, false면 참석 불가능을 의미합니다.
  • attendance의 원소 중 적어도 3개는 true입니다.

 

  입출력 예

rank attendance result
[3, 7, 2, 5, 4, 6, 1] [false, true, true, true, true, false, false] 20403
[1, 2, 3] [true, true, true] 102
[6, 1, 5, 2, 3, 4] [true, false, true, false, false, true] 50200
import java.util.Arrays;
class Solution {
    public int solution(int[] rank, boolean[] attendance) {
        int[][] array = new int[rank.length][2];
        for (int i = 0; i < rank.length; i++) {
            array[i][0] = rank[i];
            array[i][1] = i;
        }
        Arrays.sort(array, (a, b) -> a[0] - b[0]);
        int[] pick = new int[3];
        int index = 0;
        int count = 0;
        for (int i = 0; i < array.length; i++) {
            if (attendance[array[i][1]]) {
                pick[index++] = array[i][1];
                count++;
            }
            if (count == pick.length) {
                break;
            }
        }
        int answer = 10000 * pick[0] + 100 * pick[1] + pick[2];
        return answer;
    }
}

  이차원 배열 array를 생성합니다. 배열의 크기를 행은 rank의 길이, 열은 2로 지정합니다. 이는 각 학생의 등수와 순서를 담을 것입니다.

  for문이 rank의 길이만큼 순회합니다.

  array[i][0]은 rank의 i 번째 원소를, array[i][1]은 i를 할당합니다.

  Arrays 클래스의 sort 메소드를 이용하여 array를 정렬합니다. 람다식을 이용하여 a를 기준으로 오름차순으로 정렬합니다. 문제에 대입해보면 학생의 등수(array[i][0])를 기준으로 정렬하는 것입니다.

  배열 pick을 생성합니다. 배열의 크기는 3으로 지정합니다. 이는 선발된 학생을 의미합니다. 조건을 충족하는 학생을 이 배열에 담을 것입니다.

  pick의 인덱스를 담당할 변수 index를 생성합니다.

  배열의 크기를 확인할 변수 count를 생성합니다.

  for문이 array의 길이만큼 순회합니다.

  첫 번째 if문에서 attendance의 array[i][1] 번째 원소가 true인지 확인합니다.

  true라면 pick의 index 번째 원소에 array[i][1] 번째 원소를 할당합니다.

  count가 증가합니다.

  두 번째 if문에서 count가 pick의 길이와 같아진다면 반복문을 종료합니다. 만약 이 부분이 없다면 배열의 크기를 초과하는 오류가 발생할 것입니다.

  answer에 10000 * a + 100 * b + c 형식을 맞춘 계산을 담아 반환합니다.

 

  우선순위 큐를 이용한 풀이를 봤는데 이보다 훨씬 간단하게 풀 수 있었습니다. 같은 문제를 다양한 방법으로 시도해보는 것도 좋을 것 같습니다.