| 문제
외과의사 머쓱이는 응급실에 온 환자의 응급도를 기준으로 진료 순서를 정하려고 합니다.
정수 배열 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의 값을 새로운 배열 arr에 깊은 복사 합니다.
그다음 arr를 내림차순으로 정렬하지요.
내림차순으로 정렬된 배열 arr과 원래 모양을 그대로 갖춘 emergency를 반복하며 조회합니다.
만일 두 개의 값이 같은 경우가 발견된다면 결과 배열 answer에 해당 값의 순위를 반영해 줬습니다.
package com.gn.day08;
public class Solution {
public int[] solution(int[] emergency) {
// 1. emergency랑 똑같 값을 가진 배열 arr 생성
int len = emergency.length;
int[] arr = new int[len];
for(int i = 0 ; i < len ; i++) {
arr[i] = emergency[i];
}
// 2. arr를 내림차순 정렬
for(int i = 0 ; i < len-1 ; i++) {
for(int j = i; j < len ; j++) {
if(arr[i] < arr[j]) {
int temp = arr[i];
arr[i] = arr[j];
arr[j] = temp;
}
}
}
int[] answer = new int[len];
// 3. 두개의 배열 비교
for(int i = 0 ; i < len ; i++) {
for(int j = 0 ; j < len ; j++) {
if(emergency[i] == arr[j]) {
answer[i] = j+1;
}
}
}
return answer;
}
}
| 풀이 2
"나보다 더 높은 숫자인 인덱스가 있다면 나의 우선순위가 낮다"는 개념을 활용했습니다.
이중 for문을 통해 emergency 배열을 2번씩 비교합니다.
{3,76,24}가 들어있는 배열이라고 가정했을 때 3부터 한번 비교해 보면
3과 76을 비교하면 3이 76보다 작습니다.
다시 말해서 3의 우선순위는 하나 낮아졌고, 우선순위가 낮다는 건 순번이 뒤로 밀린다는 거지요.
그래서 숫자 3을 가지고 있는 인덱스 0번의 값을 +1 해줍니다. 참 쉽죠?
public class Solution {
public int[] solution(int[] emergency) {
int len = emergency.length;
int[] answer = new int[len];
for (int i = 0; i < len; i++) {
for (int j = 0; j < len; j++) {
if (emergency[i] < emergency[j]) {
answer[i]++;
}
}
answer[i]++;
}
return answer;
}
}
| 해설
배열의 속성을 잘 알고 있어야 접근할 수 있는 문제였습니다.
실제 컨셉을 이해해도 배열의 깊은 복사, 얕은 복사 개념을 몰라서 헤매는 친구를 본 적이 있습니다.
자바에서 배열은 직접적인 값을 가지고 있지 않고 주소값을 가진 객체이기 때문에
A라는 배열을 복제하고 싶을 때 A = B라는 식으로 값을 추가하면 두 배열은 같은 주소를 바라보게 되지요.
그래서 값은 똑같지만 독립적인 배열을 만들고 싶을 때는
직접 새로운 배열을 구성해서 기존 배열의 값을 넣어줘야 한다는 사실을 잊지 마세요.
꼭 해설 2처럼 획기적인 방법을 떠올리지 않아도 됩니다.
코딩테스트는 항상 근본적인 해결책을 기다리고 있답니다.
'개발 > 개발 공부' 카테고리의 다른 글
[프로그래머스] 코딩테스트 입문 : 개미군단 (0) | 2024.10.01 |
---|---|
[프로그래머스] 코딩테스트 입문 : 순서쌍의 개수 (2) | 2024.09.30 |
[프로그래머스] 코딩테스트 입문 : 외계행성의 나이 (2) | 2024.09.19 |
[프로그래머스] 코딩테스트 입문 : 배열 자르기 (0) | 2024.09.12 |
[프로그래머스] 코딩테스트 입문 : 짝수의 합 (0) | 2024.09.10 |
댓글