N

(프로그래머스 c++)위클리 챌린지 7주차 입실 퇴실 본문

프로그래머스 알고리즘/Weekly Challenge

(프로그래머스 c++)위클리 챌린지 7주차 입실 퇴실

naeunchan 2021. 10. 7. 11:05
728x90
반응형

https://programmers.co.kr/learn/courses/30/lessons/86048

 

코딩테스트 연습 - 7주차_입실 퇴실

사회적 거리두기를 위해 회의실에 출입할 때 명부에 이름을 적어야 합니다. 입실과 퇴실이 동시에 이뤄지는 경우는 없으며, 입실 시각과 퇴실 시각은 따로 기록하지 않습니다. 오늘 회의실에는

programmers.co.kr

map을 활용.

 

변수 설명

n = enter의 크기(사람 수)

leaveIndex = leave 벡터를 순회할 때 지금까지 순회한 인덱스를 저장.

answer = 정답 저장 벡터

m = 입실과 퇴실을 확인하는 map

cnt = 퇴실할 사람이 지금까지 반드시 만난 사람의 수

 

enter 벡터를 순회하면서 입실한 사람은 m에서 true로 바꿔주도록 한다.

사람 한 명이 들어올 때마다 leave를 순회하는데 currentIndex에 해당하는 사람의 번호가 m에서 true일 때에만 조건을 검사해야 한다.

(입실하지 않았는데 퇴실할 수 없으므로...)

 

만약 조건 검사에서 퇴실할 사람의 번호가 m에서 true일 때,

해당하는 사람은 퇴실 처리를 위해 m에서 false로 바꿔준다.

또한, cnt로 m에서 true인 사람을 카운팅한다.

(m에서 true인 사람들은 퇴실한 사람이 반드시 만난 경우이기 때문에)

마지막으로 회의실에 남아있는 사람들은 퇴실한 사람과 1번 만났기 때문에 +1을 해준다.

 

조건에 해당하지 않는다면 break를 통해 다음 입실하는 사람을 처리하면 된다.

#include <string>
#include <vector>
#include <map>

using namespace std;

vector<int> solution(vector<int> enter, vector<int> leave) {
    int n = enter.size();
    int leaveIndex = 0;
    vector<int> answer(n, 0);
    map<int, bool> m;
    
    for(int i = 0; i < n; i++){
        m[enter[i]] = true;
        
        for(int j = leaveIndex; j < n; j++){
            int num = leave[j];
            
            if(m[num]){
                int cnt = 0;
                
                m[num] = false;
                
                for(auto itr = m.begin(); itr != m.end(); itr++){
                    if(itr->second){
                        answer[itr->first - 1]++;
                        cnt++;
                    }
                }
                
                answer[num - 1] += cnt;
                leaveIndex++;
            } else{
                break;
            }
        }
    }
    
    return answer;
}
728x90
반응형