프로그래머스 - 진료순서 정하기 - C++
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에 삽입한다.
원소의 범위가 커진다면 다른 방법을 고안해봐야 하겠다.