포스트

[프로그래머스] 진료 순서 정하기

문제

문제 설명

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

제한사항

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

입출력 예

emergencyresult
[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합니다.

풀이

방식

  • emergency 배열 높은 숫자부터 내림차순으로 순서를 남겨야 된다.
    1. emergency 배열의 길이만큼 int 배열 answer를 만든다.
    2. 반복문을 돌려 배열 0번째부터 시작한다.
    3. 이중 반복문을 사용하여 다른 숫자들보다 크기 비교를 하여 본인이 더 작을 경우 answerindex에 1을 더한다.

제출 코드

1
2
3
4
5
6
7
8
9
10
11
12
13
class Solution {
    public int[] solution(int[] emergency) {
        int[] answer = new int[emergency.length];
        for (int i = 0; i < emergency.length; i++) {
            for (int j = 0; j < emergency.length; j++) {
                if (emergency[i] >= emergency[j]) {
                    answer[j] += 1;
                }
            }
        }
        return answer;
    }
}

다른 사람의 풀이

코드

1
2
3
4
5
6
7
8
9
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();
    }
}
  • stream을 사용하였다.
  • reverseOrder()를 사용하려 했지만 잘 되지 않아 현재 제출 코드와 같이 코드를 작성하였는데 방법을 이해해 보자.

풀이

  • boxed()로 순서대로 원시 타입에 대한 스트림 지원을 클래스 타입을 전환하였다.
  • sorted(Comparator.reverseOrder())로 내림차순으로 정렬
  • collect(Collectors.toList())을 사용해 Stream을 List로 변환
  • 기존 배열에서 해당 인덱스를 찾아 1을 더함
  • 스트림을 배열로 변환하여 반환
이 기사는 저작권자의 CC BY 4.0 라이센스를 따릅니다.