본문 바로가기

프로그래머스 코딩(자바)/Level 0

Programmers Level 0 - 진료 순서 정하기

728x90

문제 설명

외과의사 머쓱이는 응급실에 온 환자의 응급도를 기준으로 진료 순서를 정하려고 합니다. 정수 배열 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합니다.

 

1
2
3
4
5
6
7
8
9
10
11
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[i]++;
            }
        }
        return answer;
    }
}
cs

 

 

  제일 무식한 방법으로 전체를 반복하며 나의 값보다 적거나 같으면 더하기 1을 한다.
  답은 나온다
  그너나 냄새가 난다.

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
import java.util.Arrays;
class Solution {
    public int[] solution(int[] emergency) {
        int[] answer = new int[emergency.length];
        Arrays.fill(answer, 1);
        for(int i=0;i<emergency.length-1;i++) {
            for(int j=i+1;j<emergency.length;j++) {
                if(emergency[i]<=emergency[j])
                    answer[i]++;
                else
                    answer[j]++;
            }
        }
        return answer;
    }
}
cs

 

  선택 정렬 알고리즘을 이용하여 반복횟수를 n*n에서 (n*(n-1))/2 로 줄였다.
  조금 빨라지기는 했느데.... 음.....
  아직도 조금 냄세가 난다.

 

1
2
3
4
5
6
7
8
9
10
11
12
13
import java.util.Arrays;
import java.util.Collections;
class Solution {
    public int[] solution(int[] emergency) {
        int[] answer = new int[emergency.length];
        Integer tmp[] = Arrays.stream(emergency).boxed().toArray(Integer[]::new); 
        Arrays.sort(tmp,Collections.reverseOrder());
        for(int i=0; i<emergency.length; i++){
            answer[i] = Arrays.asList(tmp).indexOf(emergency[i])+1;
        }
        return answer;
    }
}
cs

 

 

  int 배열을 Integer 배열로 만든다.
  Integer tmp[] = Arrays.stream(emergency).boxed().toArray(Integer[]::new);

  역순(내림차순)으로 정렬한다.
  Arrays.sort(tmp,Collections.reverseOrder());

  동일한 값을 찾아 index + 1한다. (index는 0부터 시작 순위는 1부터 시작)
  for(int i=0; i<emergency.length; i++){
       answer[i] = Arrays.asList(tmp).indexOf(emergency[i])+1;
  }

음 이런 방법도 있군!!!!

 

1
2
3
4
5
6
7
8
9
10
11
12
import java.util.Arrays;
import java.util.Collections;
import java.util.List;
import java.util.stream.Collectors;
class Solution {
    public int[] solution(int[] emergency) {
        List<Integer> list = Arrays.stream(emergency).boxed()
                             .sorted(Collections.reverseOrder())
                             .collect(Collectors.toList());
        return Arrays.stream(emergency).map(i -> list.indexOf(i) + 1).toArray();
    }
}
cs

 

  Stream을 이용하여 역순으로 정렬하여 리스트를 만들고

  Stream을 이용하여  map()에서  위치값을 찾아 더하기 1을 하였다.

  리스트 자리에 위의 값을 쓰면 1줄로도 가능하겠다.

 return Arrays.stream(emergency).map(i -> Arrays.stream(emergency).boxed()
                                                                               .sorted(Collections.reverseOrder())
                                                                               .collect(Collectors.toList())
                                                       .indexOf(i) + 1).toArray();

728x90