알고리즘/프로그래머스 1단계

프로그래머스 - 진료순서 정하기 - C++

게임만드는학생 2023. 9. 2. 14:04

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

 

프로그래머스

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

programmers.co.kr

 

#include <string>
#include <vector>

using namespace std;

vector<int> solution(vector<int> emergency) {
    vector<int> answer;
    
    int arr[101]={0,};
    
    for(int i=0;i<emergency.size();i++)
    {
        for(int j=0;j<emergency.size();j++)
        {
            if(emergency[i]<emergency[j])arr[emergency[i]]++;
        }
    }
    
    for(int i=0;i<emergency.size();i++)
        answer.push_back(arr[emergency[i]]+1);
    
    
    return answer;
}

 

설명

vector<int> 가 주어지면 해당 숫자들의 우선순위를 순서에 바꾸지 않고 출력해야하는 문제이다. 

따라서 각 숫자마다의 우선순위와 각 숫자의 순서를 유지하거나 저장해야한다. 

 

원소의 범위가 100까지이기 때문에 arr[101] 배열을 만들었다. 

arr[3] 은 3의 우선순위를 값으로 가진다. 

 

이중 for 문을 통해 emergency[i] 를 모든 emergency 원소와 비교한다. 

j for문을 돌며 emergency[i] 의 우선순위를 정하는 것이다. 

그리고

if(emergency[i]<emergency[j])arr[emergency[i]]++;

이 조건문이 참이되면 즉, emergency[i] 보다 높은 우선순위를 가진 원소가 있다면 arr[emergency[i]]를 1 증가시킨다. 

arr[i] 는 i 의 우선순위를 값으로 가진다고 하였다. 

예를 들자.

ex) emergency = {4,76,24} 일 때,

emergency[i] = 4;

emergency[j] = 76; 이면

조건문이 참이된다. 

그리고 arr[emergency[i]]  즉, arr[4] 를 1 증가시키는 것이다. 

우선순위가 가장 높은 수는 1을 가질 것이고 자신보다 우선순위가 높은 숫자가 있을 때마다 1씩 더해서 우선순위를 하나씩 낮춘다. 

 

for(int i=0;i<emergency.size();i++)
        answer.push_back(arr[emergency[i]]+1);

마지막에 answer에 arr[emergency[i]+1]을 순서대로 넣어주면 emergency 에 있던 숫자들의 순서대로 우선순위를 넣을 수 있다. 

ex) emergency = {4,76,24} 이면

arr = {0,0,0,0,2......,1,.......0,.....} 이다. (=> arr을 0으로 초기화했었다. 따라서 answer에 삽입할 때 1씩 더한다. )

즉 arr[4] = 2, arr[24] = 1, arr[76] = 0 이다.

 

arr[emergency[0]] 는 arr[4] 이고 3을 answer에 삽입한다. 

arr[emergency[1]] 은 arr[76] 이고 1을 answer에 삽입한다.

arr[emergency[2]] 은 arr[24] 이고 2을 answer에 삽입한다.

 

원소의 범위가 커진다면 다른 방법을 고안해봐야 하겠다.