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

Walter Mitty·2022년 11월 19일
0

Algorithm

목록 보기
25/29
post-thumbnail

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

나의 풀이: 실패

import java.util.*;
class Solution {
    public int[] solution(int[] emergency) {
        int[] asc = emergency;
        int[] answer = new int[emergency.length];
       
        Arrays.sort(asc);
        
        for(int i=0; i<=emergency.length-1; i++) {
            for(int j=0; j<=emergency.length-1; j++) {
                if(asc[i]==emergency[j]) {
                    answer[j]=emergency.length-i;
                }
            }
        }
        return answer;
    }
}
  • 실패원인: 참조값을 생각 못함!
    asc=emergency를 해버리면 emergency의 참조값이 asc에 대입이 된다.
    따라서 메모리 영역에서는 같은 공간을 asc와 emergency이 공유를 하고 있고, asc를 sort해버리면 같은 공간을 공유(같은 참조값)하는 emergency도 sort가 되어버린다.
    잘 보면 참조값도 같고, 출력값을 통해 emergency와 asc 둘다 sort되어있다는 걸 확인할 수 있다.

    • 해결책 1: 새로운 배열 변수를 선언하고 거기에 emergency의 값을 for문으로 담아준다.
    • 해결책 2:clone 함수를 활용

해결책 1로 풀이

import java.util.*;
class Solution {
    public int[] solution(int[] emergency) {
    	// asc라는 배열을 새로 선언해서 새로운 메모리 공간을 확보하고
        int[] asc = new int[emergency.length];
        int[] answer = new int[emergency.length];
        
        // for돌려서 값 하나하나 넣어준다.
        for(int i=0; i<=emergency.length-1; i++) {
            asc[i]=emergency[i];
        }
        
        Arrays.sort(asc);
        
        for(int i=0; i<=emergency.length-1; i++) {
            for(int j=0; j<=emergency.length-1; j++) {
                if(asc[i]==emergency[j]) {
                    answer[j]=emergency.length-i;
                }
            }
        }
        return answer;
    }
}

해결책 2로 풀이

import java.util.*;
class Solution {
    public int[] solution(int[] emergency) {
        int[] asc = emergency.clone();
        int[] answer = new int[emergency.length];
        
        Arrays.sort(asc);

        for(int i=0; i<=emergency.length-1; i++) {
            for(int j=0; j<=emergency.length-1; j++) {
                if(asc[i]==emergency[j]) {
                    answer[j]=emergency.length-i;
                }
            }
        }
        return answer;
    }
}
  • .clone() 새로운 메모리 공간에 값 복사
class Main {
  public static void main(String[] args) {
    int a[] = {1, 8, 3}; 
    int b[] = a.clone();     

    b[0] = 10; 

    // 결과 확인
    System.out.print("a 배열 : "); 
    for (int v:a) 
        System.out.print(v + " "); 

    System.out.print("\nb 배열 : "); 
    for (int v:b) 
        System.out.print(v + " "); 
  }
}

a 배열: 1 8 3
b 배열: 10 8 3

참고자료: 배열 복사/복제1

참고자료: 배열 복사/복제2

0개의 댓글