본문 바로가기
개발/개발 공부

[프로그래머스] 코딩테스트 입문 : 진료순서 정하기

by 하모예 2024. 9. 20.

| 문제

외과의사 머쓱이는 응급실에 온 환자의 응급도를 기준으로 진료 순서를 정하려고 합니다. 

정수 배열 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처럼 획기적인 방법을 떠올리지 않아도 됩니다.

코딩테스트는 항상 근본적인 해결책을 기다리고 있답니다.

댓글