Develop

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

개인 공부/프로그래머스

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

개발 기록 2024. 1. 13. 19:44

문제

 

내풀이

import java.util.Arrays;
import java.util.Collections;

class Solution {
    public int[] solution(int[] emergency) {
        int[] answer = new int[emergency.length];;
        Integer[] emergency2= new Integer[emergency.length];
        int i = 0;
        int arrSize = emergency.length;

        // ememrgency 에 값 넣기
        for(int a : emergency){
            emergency2[i] = (Integer)a;
            //System.out.println("1 : "+ emergency[i]);
            //System.out.println("2 :" + emergency2[i]);
            i++;
        }

        // emergency2를 내림차순 정렬
        Arrays.sort(emergency2, Collections.reverseOrder());

        // 순서대로 같은 값을 찾아서 같으면 answer에 순위 입력
        for(int x = 0; x < emergency2.length; x++){ // 내림차순 배열만큼 반복
           for(int y = 0; y < emergency.length; y++){ // 주어진 배열만큼 반복
                if(emergency2[x] == emergency[y]){
                    answer[y] = x+1;
                }
           } //for2
        } //for1

        // for(int z =0; z < answer.length ;z++){
        //      System.out.println( "answer["+ z +"] : " + answer[z]);  
        // }

        return answer;
    }
}

 

느낀점

 

로직 : 내림차순 정리 후 다른 배열,같은 위치에 순위를 입력해줌

 

맥스값을 가져와서 할지 아니면 정리 후에 할지 고민했는데

sort함수 써보고 싶어서 이렇게 함!

 

Collections.reverseOrder()를 사용하려면 int형이 아닌 Integer형을 사용해야 한다

int는 오류남!! 

 

다른 풀이1

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;
    }
}

 

느낀점

 

로직 : 자신보다 큰 수만큼 카운트하여 순위를 결정하는 방법

정렬보다 신박했고 간단해서 매우 괜찮은 방법이라 생각함

 

그러나 첫번재 if문과 continue는 왜 넣었는지 모르겠다

여러번 테스트하다가 들어간 코드인데 안지운건가? 라고 생각했으나

=> 순위가 정해진 answer의 인덱스 번호의 값은 뛰어넘는 조건문이라고 한다

이미 값이 정해진 인덱스는 건너뛰기위한 목적이라고 한다 Good

 

다른 풀이2

import java.util.*;
class Solution {
    public int[] solution(int[] emergency) {
        Map<Integer, Integer> map = new HashMap<>();
        int[] emergencySort = Arrays.copyOfRange(emergency, 0, emergency.length);
        Arrays.sort(emergencySort);
        int size = emergency.length;
        for(int i = 0; i<emergencySort.length; i++){
            int e = emergencySort[i];
            map.put(e, size-i);
        }
        for(int i = 0; i<emergency.length; i++){
            emergency[i] = map.get(emergency[i]);
        }
        return emergency;
    }
}

 

느낀점

 

HashMap<>을 이용한 풀이

Map에 대해서 더 공부해봐야겠다

 

Arrays.copyOfRange() : 배열 복사 함수로 배열을 0에서부터 emergency.length 까지 복사해준다

그러나 이렇게 복사한 내용은 얕은 복사일 수 있므로 조심하자!

 

 

다른 풀이3

import java.util.*;
class Solution {
    public int[] solution(int[] emergency) {
        int[] answer = new int[emergency.length];
        int[] sort = Arrays.copyOf(emergency, emergency.length);
        Arrays.sort(sort);
        Map<Integer, Integer> rank = new HashMap<Integer, Integer>();
        int rankIdx = 1;
        for (int idx = sort.length - 1; idx >= 0; idx--) {
            rank.put(sort[idx], rankIdx++);
        }
        for (int idx = 0; idx < emergency.length; idx++) {
            answer[idx] = rank.get(emergency[idx]);
        }
        return answer;
    }
}

 

느낀점

 

이것도 Map을 이용한 풀이이다.

Map을 공부하고 다시 보도록 하자

 

 

주말에 자바 이론 정리할 것

- 배열

- 정렬 sort / 오름차순 / 내림차순

- Map (HashMap)