코딩테스트/프로그래머스

[프로그래머스] Java :: 전국 대회 선발 고사

블로그 주인장 2024. 3. 23.

문제 링크

https://school.programmers.co.kr/learn/courses/30/lessons/181851

 

프로그래머스

코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.

programmers.co.kr

 

문제 설명

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

 

코드 구현 (Collection 사용)

import java.util.*;

class Solution {
    public int solution(int[] rank, boolean[] attendance) {
        Map<Integer, Integer> map = new HashMap<>();
        for (int i = 0; i < rank.length; i++) {
            if (attendance[i]) {
                map.put(rank[i], i);
            }
        }

        List<Integer> list = new ArrayList<>(map.keySet());
        list.sort(Integer::compareTo);

        int a = map.get(list.get(0));
        int b = map.get(list.get(1));
        int c = map.get(list.get(2));

        return 10000 * a + 100 * b + c;
    }
}

 

풀이

  1. rank와 attendance의 배열의 길이가 같기 때문에, 2개의 배열 중 하나를 대상으로 for문을 돌린다.
  2. 전국 대회에 참여할 수 있는 학생의 랭크, rank 배열의 인덱스 값을 Map 에 저장한다.
  3. 저장한 Map의 Key 값을 오름차순으로 정렬한다.
    • Collection(List) 오름차순 sorting 방법
      1. list.sort(Integer::compareTo);
      2. list.sort((a,b) -> a.compareTo(b));
      3. list.sort(Comparator.naturalOrder());
  4. 저장한 key 값을 기준으로 인덱스 값을 a, b, c에 저장하여 값을 반환시킵니다.

 

코드 구현 (배열 이용 방식)

import java.util.*;

class Solution {
    public int solution(int[] rank, boolean[] attendance) {
        int answer = 0;
        int[] arr = new int[rank.length];
        for (int i = 0; i < arr.length; i++) {
            if (attendance[i]) {
                arr[i] = rank[i];
            } else {
                rank[i] = Integer.MAX_VALUE;
            }
        }

        Arrays.sort(rank);

        for (int j = 0; j < arr.length; j++) {
            if (rank[0] == arr[j]) {
                answer += 10000 * j;
            } else if (rank[1] == arr[j]) {
                answer += 100 * j;
            } else if (rank[2] == arr[j]) {
                answer += j;
            }
        }

        return answer;
    }
}

 

풀이

  1. rank와 attendance의 배열의 길이가 같기 때문에, 2개의 배열 중 하나를 대상으로 for문을 돌린다.
  2. for문을 돌릴 때 attendance가 true인 경우 rank의 순위를 새로 만든 arr 배열에 넣고,
    false인 경우에는, 정수의 최대값을 넣는다.
  3. 이 후 배열의 오름차순 정렬(Arrays.sort(rank))를 한다.
  4. for문을 돌려서 정렬한 rank의 값과 기존의 배열의 값인 arr의 값을 비교하여 해당 지문에 맞는 계산을 진행한다.
반응형

댓글