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