응급실 / 중복확인

-·2024년 1월 2일
0

Inflearn-basicTest

목록 보기
22/27

응급실

✏️ 문제

* 설명
메디컬 병원 응급실에는 의사가 한 명밖에 없습니다.
응급실은 환자가 도착한 순서대로 진료를 합니다. 하지만 위험도가 높은 환자는 빨리 응급조치를 의사가 해야 합니다.
이런 문제를 보완하기 위해 응급실은 다음과 같은 방법으로 환자의 진료순서를 정합니다.
• 환자가 접수한 순서대로의 목록에서 제일 앞에 있는 환자목록을 꺼냅니다.
• 나머지 대기 목록에서 꺼낸 환자 보다 위험도가 높은 환자가 존재하면 대기목록 제일 뒤로 다시 넣습니다. 그렇지 않으면 진료를 받습니다.
즉 대기목록에 자기 보다 위험도가 높은 환자가 없을 때 자신이 진료를 받는 구조입니다.
현재 N명의 환자가 대기목록에 있습니다.
N명의 대기목록 순서의 환자 위험도가 주어지면, 대기목록상의 M번째 환자는 몇 번째로 진료를 받는지 출력하는 프로그램을 작성하세요.
대기목록상의 M번째는 대기목록의 제일 처음 환자를 0번째로 간주하여 표현한 것입니다.

* 입력
첫 줄에 자연수 N(5<=N<=100)과 M(0<=M<N) 주어집니다.
두 번째 줄에 접수한 순서대로 환자의 위험도(50<=위험도<=100)가 주어집니다.
위험도는 값이 높을 수록 더 위험하다는 뜻입니다. 같은 값의 위험도가 존재할 수 있습니다.

* 출력
M번째 환자의 몇 번째로 진료받는지 출력하세요.

🔍풀이

같은 위험도의 환자가 존재하기 때문에 하나의 변수만을 가지고 nth번째 환자를 추적하는 것은 매우 어렵고 복잡한 코드를 작성해야 한다.
따라서 Class타입을 만들어서 두 가지의 변수를 활용해 해결한다.


class Person{
	int id;
    int priority;
    
    //생성자 
    public Person(int id, int priority){
        this.id = id;
        this. priority = priority;
    }
}

public int solution(int num, int nth, int[] line) {
    int answer = 0;
    Queue<Person> Q = new LinkedList();
    for(int i = 0; i < num; i++){
    	// id : nth, priority : 위험도 
    	Q.offer(new Person(i, line[i]);
    }
    while(!Q.isEmpty()){
    	Person tmp = Q.poll();
        // 위험도 우선순위 체크
        for(Person p : Q){
        	if(tmp.priority < p.priority){
            	Q.offer(tmp);
                tmp = null; // 이후 조건문을 위한 null값 초기화
                break; 
            }
        }
        // 더 높은 우선순위가 발견되지 않은 경우 
        if(tmp != null){
        	answer++;
            //추적하는 환자의 차례의 경우
            if(tmp.id == nth) return answer;
        }
    }
    
    return answer;
}

중복확인

✏️ 문제

* 설명
현수네 반에는 N명의 학생들이 있습니다.
선생님은 반 학생들에게 1부터 10,000,000까지의 자연수 중에서 각자가 좋아하는 숫자 하나 
적어 내라고 했습니다.
만약 N명의 학생들이 적어낸 숫자 중 중복된 숫자가 존재하면 D(duplication)를 출력하고,
N명이 모두 각자 다른 숫자를 적어냈다면 U(unique)를 출력하는 프로그램을 작성하세요.

* 입력
첫 번째 줄에 자연수 N(5<=N<=100,000)이 주어진다.
두 번째 줄에 학생들이 적어 낸 N개의 자연수가 입력된다.

* 출력
첫 번째 줄에 D 또는 U를 출력한다.

🔍풀이
1.TreeSet을 사용하여 size비교

    public Character solution(int n, int[] arr) {
        Character answer = 'D';
        Set<Integer> set = new TreeSet();
        for(int i : arr) set.add(i);
        if(set.size() == arr.length) answer = 'U';
        
        return answer;
    }

2.정렬을 이용한 중복값 비교

    public Character solution(int n, int[] arr) {
        Character answer = 'U';
        Array.sort(arr);
        for(int i = 0; i < arr.length-1; i++){
        	if(arr[i] == arr[i+1] return 'D';
        }
        
        return answer;
    }
profile
신입 개발자의 개인 공부 공간입니다

0개의 댓글