2 minute read

진료 순서 정하기

문제 설명

외과의사 머쓱이는 응급실에 온 환자의 응급도를 기준으로 진료 순서를 정하려고 합니다. 정수 배열 emergency가 매개변수로 주어질 때 응급도가 높은 순서대로 진료 순서를 정한 배열을 return하도록 solution 함수를 완성해주세요.


제한사항

  • 중복된 원소는 없습니다.
  • 1 ≤ emergency의 길이 ≤ 10
  • 1 ≤ emergency의 원소 ≤ 100

입출력 예

emergency result
[3, 76, 24] [3, 1, 2]
[1, 2, 3, 4, 5, 6, 7] [7, 6, 5, 4, 3, 2, 1]
[30, 10, 23, 6, 100] [2, 4, 3, 5, 1]

입출력 예 설명

입출력 예 #1

  • emergency가 [3, 76, 24]이므로 응급도의 크기 순서대로 번호를 매긴 [3, 1, 2]를 return합니다.

입출력 예 #2

  • emergency가 [1, 2, 3, 4, 5, 6, 7]이므로 응급도의 크기 순서대로 번호를 매긴 [7, 6, 5, 4, 3, 2, 1]를 return합니다.

입출력 예 #3

  • emergency가 [30, 10, 23, 6, 100]이므로 응급도의 크기 순서대로 번호를 매긴 [2, 4, 3, 5, 1]를 return합니다.

나의 풀이 코드

import java.util.Arrays;
import java.util.HashMap;
import java.util.Map;

class Solution {
    public int[] solution(int[] emergency) {
        // 1.기존의 emergency 배열과 sort_emergency 배열이 필요하므로 복제
        int[] sort_emergency = emergency.clone();
        
        // 2.sort_emergency 배열 sort
        Arrays.sort(sort_emergency);
        
        // 3. 매핑작업 
        Map<Integer, Integer> sort_emergencyRank = new HashMap<>();
        for (int i = 0; i < sort_emergency.length; i++) {
            //키: 각 요소  
            //값: 배열길이 - i
            sort_emergencyRank.put(sort_emergency[i], sort_emergency.length - i);
        }
        
        //4. answer 배열에 저장 기존 emergency 배열의 요소를 키에 해당하는 값을 넣어주기
        int[] answer = new int[emergency.length];
        for (int i = 0; i < emergency.length; i++) {
            answer[i] = sort_emergencyRank.get(emergency[i]);
        }
        
        return answer;
    }
}



sort한 배열과 기존의 배열 둘다 필요해서 배열 하나를 복제 하였다.

이후, 해시맵을 사용하여 각 요소와 값으로 배열길이에 i(인덱스)를 빼주어서 값이 클수록 반대로 순위가 높도록 키를 매핑 시켰다.

마지막으로, 기존의 배열에 값들에 해당하는 키를 answer 배열에 차곡차곡 넣어준다.

배운점

import java.util.Arrays;
import java.util.Comparator;
import java.util.stream.Collectors;

class Solution {
    public int[] solution(int[] e) {
        return Arrays.stream(e)
                        .map(i -> Arrays.stream(e)
                                        .boxed()
                                        .sorted(Comparator.reverseOrder())
                                        .collect(Collectors.toList())
                                        .indexOf(i) + 1)
                        .toArray();
    }
}

남이 푼 코드를 보면 스트림을 이용한다.

Arrays.stream(e)//e배열을 스트림으로 변환
        .map(i -> Arrays.stream(e) //매핑, e 배열을 다시 스트림으로 변환
                        .boxed() //정렬하기 위해 스트림의 요소 타입을 Integer로 변경
                        .sorted(Comparator.reverseOrder()) // 정렬된 스트림을 생성 
                        .collect(Collectors.toList()) //스트림의 요소를 리스트로 collect
                        .indexOf(i) + 1) //정렬된 리스트에서 i의 요소의 인덱스를 찾아서 1을 더함.
        .toArray(); //트림의 결과를 배열로 변환


class Solution {
    public int[] solution(int[] emergency) {
        int[] answer = new int[emergency.length];

        for(int i = 0; i < answer.length; i++){
            if(answer[i] != 0){
                continue;
            }
            int idx = 1;
            for(int j = 0; j < answer.length; j++){
                if(emergency[i] < emergency[j]){
                    idx++;
                }
            }
            answer[i] = idx;
        }
        return answer;
    }
}

또다른 남이 푼 코드를 보면 각 원소에 대해 해당 원소보다 큰 원소의 개수를 계산하여 배열로 반환한다.

이중 반복문 안에서 i를 기준으로 j를 하나씩 올려가면서 비교하고 만약 i가 작다면 idx를 1씩 더해가면서 해댱 요소의 순위를 낮추는것이다.

if(answer[i] != 0) {
    continue;
}

다만 위 코드가 이해하기 어려웠는데 내가 이해한게 맞다면

answer 배열은 처음에 모두 0으로 되어있기 때문에 0이 아닌값 즉, 이미 처리된 값 즉, 해당자리에 0이 아닌 idx가 저장된 값이라면 현재 반복을 중단하고 다음 반복으로 넘어가는 뜻이다.

Leave a comment