상세 컨텐츠

본문 제목

[TIL#17] Study] 코딩 테스트 5

개인 공부/코딩 테스트

by DK9 2023. 11. 8. 09:37

본문

전국 대회 선발 고사

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

 

public int solution(int[] rank, boolean[] attendance) {
    int answer = 0;
    // 전국 대회에 선발된 학생 번호들을 등수가 높은 순서대로 각각 a, b, c번
    List<Integer> grade = new ArrayList<>();
    for (int i = 0; i < attendance.length; i++) {   // i = 등록 번호
        if (attendance[i]) {                // 참석 가능한 사람의
            grade.add(rank[i]);           // 랭크
        }
    }                                       // grade = 참석 가능한 사람의 랭크

    Collections.sort(grade);             // 등수 오름차순 정렬

    int sum = 0;
    for (int i = 0; i < grade.size(); i++) {      // 참석자들의 등수를 기준으로
        for (int j = 0; j < rank.length; j++) {     // 등록 번호를 찾는다.
            if (grade.get(i) == rank[j]) {                  // grade.get(i) = 랭크 = rank[j]
                sum = j * 10000 / ((int) Math.pow(100, i)); // i = 랭크 순서 , j = 등록 순서
                answer += sum;
            }
        }
    }
    return answer;

 

  • 배열만을 이용해서 풀려다가 배열을 선언하고, 반복문을 돌리면서 생성하는 방법을 몰라서 배열만 사용해서 푸는 것은 포기했다. 리스트를 사용했을 때 확실히 편리하다.
  • grade.get[ i ]가 뭔지 <= 여기서 i 가 무엇을 의미하는지, rank[ j ]는 뭔지 이런 것들이 많이 헷갈렸다. 이런 점을 바탕으로 생각해보면 가독성이 좋은 코드는 아닌 것 같다.
  • 수정 전 풀이 방법 :
    • A. 참석 가능한 사람의 등록 번호를 구하고,
    • B. 그 등록 번호의 랭크를 구하고 오름차순 정렬,
    • 오름차순 된 랭크(=B)를 통해 등록 번호(=A)를 구했다.
  • 위의 코드를 완성하기 전에는 3단계였다. 하지만 생각해보니 등수를 구했다면 등록번호는 매개변수 배열 자체에서 찾아도 된다고 판단하여 A를 삭제했다.
  • 마지막 answer를 구하는 과정에서도 코드 중복되면 멋이 없으니 저렇게 구했다. 더 멋이 없는 것 같다.

관련글 더보기