새소식

Programmers Coding Test/Java

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

  • -

 

 

진료순서 정하기

 

 

 

https://school.programmers.co.kr/learn/courses/30/lessons/120835

 

프로그래머스

코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.

programmers.co.kr

 

 

 

1)  문제

외과의사 머쓱이는 응급실에 온 환자의 응급도를 기준으로 진료 순서를 정하려고 합니다. 
정수 배열 emergency가 매개변수로 주어질 때 
응급도가 높은 순서대로 진료 순서를 정한 배열을 return하도록 solution 함수를 완성해주세요.
제한사항
중복된 원소는 없습니다.
1 ≤ emergency의 길이 ≤ 10
1 ≤ emergency의 원소 ≤ 100

 

 

 

2)  예시

 

 

Result Table
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가 [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합니다.

 

 

 

 

 

3)  풀이

 

 

1. 클래스 선언을 해줍니다

● class Solution {

클래스명은 대문자로 시작해야하고, 정답이라는 의미로 Solution이라는 단어를 사용하였습니다.

 

 

 

 

2. 정수배열 emergency를 매개변수로 하는 solution 메소드를 선언합니다.

solution은 정수배열을 반환하므로 데이터타입을 int[]으로 합니다.

●  public int[] solution(int[] emergency) {

 

 

 

 

3. emergency 배열 길이와 emergency 원소에 대한 제한사항을 검사합니다. 제한사항을 만족하지 않을 경우, 예외처리합니다.

    if (1 > emergency.length || emergency.length > 10) {
            throw new IllegalArgumentException("emergency 배열의 길이는 1 이상 10 이하입니다.");
        }

        for (int value : emergency) {
            if (value < 1 || value > 100) {
                throw new IllegalArgumentException("emergency 배열의 각 원소는 1 이상 100 이하의 값이어야 합니다.");
            }
        }

 

배열원소를 확인할 때 향상된 for문을 사용하였는데 기존 for문이라면 이러합니다.

for(int i= 0; i < emergency.length; i++){

      int value = emergency[i];

}

 

 

 

 

4. 정답이 되는 응급도에 따른 순위배열을 answer로 합니다.

순서이니 기존 emergency가 가지는 길이와 동일하게 배열 원소의 수를 가지도록 합니다.

   int[] answer = new int[emergency.length];

 

 

 

 

5. 하나의 원소를 가지고 다음원소, 그다음원소, 그다음다음원소 ~ 마지막원소까지 비교해서

비교할 원소보다 작다면 진료받는 순서를 뒤로 보내기위에 +1을 해줄 것입니다.

 

그러므로 아래 코드처럼 하나의 원소가 바깥 for문, 비교될 원소가 안쪽 for문이 되도록하고,

바깥쪽 for문에서 우선 기본 순서 order를 1로 가지고, 안쪽 for문에서 크기비교를 통해 순서가 +1씩 증가하게 만듭니다.

그 순서가 answer의 i번째 원소가 되고, 최종적으로 answer로 반환해줍니다.

  for(int i = 0; i < answer.length; i++){
            int order = 1;
            for(int j = 0; j < answer.length; j++){
                if(emergency[i] < emergency[j]){
                    order++;
                }
            }
            answer[i] = order;
        }
        return answer;
    }
}

 

 

 

 

 

 

 

4)  코드

 

class Solution {
    public int[] solution(int[] emergency) {
        if (1 > emergency.length || emergency.length > 10) {
            throw new IllegalArgumentException("emergency 배열의 길이는 1 이상 10 이하입니다.");
        }

        for (int value : emergency) {
            if (value < 1 || value > 100) {
                throw new IllegalArgumentException("emergency 배열의 각 원소는 1 이상 100 이하의 값이어야 합니다.");
            }
        }

        int[] answer = new int[emergency.length];

        for(int i = 0; i < answer.length; i++){
            int order = 1;
            for(int j = 0; j < answer.length; j++){
                if(emergency[i] < emergency[j]){
                    order++;
                }
            }
            answer[i] = order;
        }
        return answer;
    }
}

 

 

 

 

 

5)  평가

두개의 for문을 적어두고서는, i와 j가 동시에 증가한다는 착각에 빠져 한참 고민했습니다.

그 이후에는 기본값으로 1을 두고 +1씩 해준게 아니라, 그냥 +1씩 해주어서 가장 먼저 진료 받아야하는 순서가 0으로 출력되는 오류도 있었습니다.

가볍다면 정말 가벼운 문제였지만 30여분을 머리 싸매다가 결국 해결...ㅠㅠㅠㅠㅠ

다른 사람의 풀이를 참조하여 코드 정리를 하였는데 신기했던건 sort로 풀거나 stream을 이용한 방식도 있었다는 점.

HashMap을 사용하는 방법도 좋아보였으나 그건 차후에 시도해보는걸로!

 

 

 

 

 

 

 

 

 

Contents

포스팅 주소를 복사했습니다

이 글이 도움이 되었다면 공감 부탁드립니다.