본문 바로가기
CodingTest/Programmers

[프로그래머스] Lv.0 진료순서 정하기**

by yoondoo 2022. 12. 19.
728x90
import java.util.Arrays;
import java.util.HashMap;
class Solution {
    public int[] solution(int[] emergency) {
       int[] answer = emergency;
        int[] preanswer = Arrays.copyOf(answer, answer.length);
        int[] result = new int[answer.length];
        HashMap<Integer, Integer> map  = new HashMap<>();
        Arrays.sort(answer);
        int idx = answer.length;
        for(int i=0; i<answer.length; i++) {
        	map.put(answer[i], idx);
        	idx--;
        }
//        for (Entry<Integer, Integer> entrySet : map.entrySet()) {
//            System.out.println(entrySet.getKey() + " : " + entrySet.getValue());
//        }
        for(int i=0; i<answer.length; i++) {
        	result[i] = map.get(preanswer[i]);
        }
        return result;
    }
}

 

드디어 처음으로 컬렉션 중 하나인 Map을 사용해 보았다!!!!!!

입력 받은 배열의 요소 중 높은 숫자가 응급도가 1이 될 수 있도록 해야되는 문제다.

 

먼저
1. answer에는 매개변수로 받은 배열의 주소값을 넣는다.

2. 나중에 원본배열과 비교해야하기 때문에 preanswer배열에 정렬하기 전 answer배열을 복사한다.

3. answer배열을 오름차순으로 정렬한다.

4. 순위를 매기기위한 idx변수를 answer의 길이로 초기화한다.(수가 낮을수록 응급도가 낮기 때문)

5. map.put()을 이용하여 key값은 정렬된 앞의 숫자부터 value에는 idx값을 넣어주고 idx--감소시켜준다.

6. 빈 result배열에 원본배열을 저장했던 preanswer배열의 key에 해당하는 value값을 차례로 저장해준다.

 

ex) 원본배열 = [3, 27, 10]

정렬 후 배열 => [3, 10, 27]

map { '3' : 3, '10' : 2, '27' : 1}

원본 배열[3, 27, 10]에 해당하는 key의 value값을 불러오기

result => [3, 1, 2]

 

※ 주의할 점

int[ ] preanswer = answer;(얕은복사) 하면 안된다.

왜냐하면 이렇게 하면 배열의 요소들을 복사한게 아니라 배열의 주소값을 같이 공유하는 것이기 때문에

answer를 sort하는 순간 preanswer도 정렬된 배열을 가르키고 있기 때문에 Arrays.copyOf()를 이용해서 원본배열을 따로 복사(깊은복사)해주어야 한다.

 

얕은복사 깊은복사 차이

출처 - https://coding-factory.tistory.com/548
출처 - https://coding-factory.tistory.com/548

깊은 복사에 사용할 수 있는 메서드
1. Object.clone();

2. Arrays.copyOf(복사할 배열, 새 배열의 길이);
ex) int[ ] arr2 = Arrays.copyOf(arr1, arr1.length);

3. System.arraycopy(복사할 배열, 시작위치, 새 배열, 새 배열 시작위치, 복사할 배열의 길이);
ex) System.arraycopy(num, 0, newNum, 0, num.length);
==> num[0]에서 newNum[0]으로 num.length개의 데이터를 복사

2차원 배열의 복사에 대해서도 알아보자

출처 - https://coding-factory.tistory.com/548

2차원 배열을 복사할 때 위의 메서드를 그냥 사용하게 되면 a[x]에 해당하는 값만 깊은 복사가 되고

a[x][y]에 해당하는 값은 복사가 되지 않는다.

구조가 다르기 때문이다.

 

2차원 배열을 깊은 복사하기 위한 2가지 방법이 있다.

 

방법 1) 이중 for문 이용하기

int[][] a = {{1,2,3},{4,5,6},{7,8,9}};		//3행 3열 
int[][] b = new int[a.length][a[0].length];	//a.length는 y좌표를 가르키고 있는 a[x]의 길이-> 행의 갯수
//위의 그림 참고					//a[0].length는 a[0]이 가르키고 있는 a[0][y]의 길이-> 열의 갯수
for(int i=0; i<a.length; i++){
	for(int j=0; j<a[0].length; j++){
    	b[i][j] = a[i][j]; 
    }
}

방법 2) System.arraycopy사용

int[][] a = {{1,2,3},{4,5,6},{7,8,9}};		//3행 3열 
int[][] b = new int[a.length][a[0].length];	//a.length는 y좌표를 가르키고 있는 a[x]의 길이-> 행의 갯수
//위의 그림 참고					//a[0].length는 a[0]이 가르키고 있는 a[0][y]의 길이-> 열의 갯수
for(int i=0; i<a.length; i++){
	System.arraycopy(a[i], 0, b[i], 0, a[0].length);
}
반응형

댓글