[프로그래머스] 위클리 챌린지 7주차

고재욱·2021년 9월 15일
1

Programmers

목록 보기
3/5

❓ 문제 ❓
위클리 챌린지 7주차

💯 풀이 방법 💯
문제 풀이가 상당히 까다로웠다.
1. 입실하는 사람을 배열에 넣고, 퇴실하는 사람을 큐에 넣어서 하나씩 비교했다.
2. 큐의 top에 있는 사람이 입실한 배열 안에 있으면 큐와 배열에서 제거한다.
3. 이 과정에서 제거한 사람이 총 만난 인원은 배열의 크기만큼이고, 배열에 있는 인원이 만난 사람 +1을 해준다.
4. 2번 과정을 반복한다. 나갈 사람이 없을 시 1번 부터 다시 시작해서 사람의 수 만큼 반복한다.

#include <string>
#include <vector>
#include <deque>

using namespace std;

vector<int> solution(vector<int> enter, vector<int> leave) {    
    int size = enter.size();

    vector<int> answer(size);
    deque<int> in_q, out_q;

    for (int i = 0; i < size; i++) {
        int in = enter[i];  // 방에 들어오는 수
        int out = leave[i]; // 방에 나가는 수
        
        in_q.push_back(in);     // 배열에 넣어
        out_q.push_back(out);   // 큐에 넣어

        int q_size = in_q.size();

        for (int i = q_size - 1; i >= 0; i--) {
            int tmp = in_q[i];
            
            if (!out_q.empty() && tmp == out_q[0]) {
                // 현재 가리키고 있는 사람이 나가야 되는 사람이면(큐의 가장 맨 앞에 있음)
                out_q.pop_front();  // 큐 pop
                in_q[i] = -1;       // 배열에 나갔다고 표시
                
                for (int j = 0; j < in_q.size(); j++) {
                    // 배열에 있는 사람 수 == 현재 나가는 사람의 만난 수
                    if (in_q[j] == -1) continue;
                    answer[tmp - 1] ++;
                }
                
                for (int j = 0; j < in_q.size(); j++) {
                    // 현재 나간 사람 만난거여서 배열에 있는 사람 다 +1 해줌
                    if (in_q[j] == -1) continue;
                    answer[in_q[j] - 1]++;
                }
                i = q_size - 1; // 큐에 남아 있는 사람들을 다시 확인해야됨
            }
        }

    }
    
    return answer;
}

0개의 댓글

관련 채용 정보