본문 바로가기
알고리즘/프로그래머스

알고리즘(C++) / 프로그래머스 위클리 챌린지 7주차 : 입실 퇴실

by clean_h 2021. 9. 14.
728x90

위클리 챌린지 7주차 : 입실 퇴실

https://programmers.co.kr/learn/courses/30/lessons/86048?language=cpp# 

 

코딩테스트 연습 - 7주차

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

programmers.co.kr

 

코드

//프로그래머스 7주차 입실 퇴실
#include <iostream>
#include <string>
#include <vector>
#include <algorithm>

using namespace std;

vector<int> solution(vector<int> enter, vector<int> leave) {
    vector<int> answer(enter.size() + 1);
    vector<int> inout;

    int leave_i = 0;
    int enter_i = 0;

    while (enter_i != enter.size()) {
        //퇴실
        if (find(inout.begin(), inout.end(), leave[leave_i]) != inout.end()) {
            inout.erase(find(inout.begin(), inout.end(), leave[leave_i])); //퇴실
            leave_i++;
        }
        //입실
        else {
            for (int i = 0; i < inout.size(); i++) {
                answer[inout[i]] += 1; //만난 사람 증가
            }
            answer[enter[enter_i]] += inout.size();
            inout.push_back(enter[enter_i]); //입실
            enter_i++;
        }

    }
    //113223

    answer.erase(answer.begin());
    return answer;
}

int main() {
    vector<int> enter = { 1,3,2 };
    vector<int> leave = { 1,2,3 };
    solution(enter, leave);
    return 0;
}

 

설명

  • inout 벡터에 회의실에 누가 있는지 기록한다.
  • 입실 순서와 퇴실 순서만 적혀있고 시각은 따로 적혀있지 않다. 무조건 입실을 하여야 퇴실을 할 수 있다.
  • 따라서 퇴실 순서대로 퇴실을 하는데 퇴실할 사람이 입실하지 않았다면 입실 순서대로 입실한다.
  • 만약 입출력 예#1에서 1번이 퇴실할 순서인데 퇴실할 1번이 존재하지 않으므로 입실 순서인 1번이 입실한다.
  • 1번이 입실하면 1번이 퇴실할 수 있다.
  • 입실할 때는 벡터에 push하고 퇴실할 때는 벡터를 erase한다.
  • 입실할 때 방에 있는 사람들은 무조건 만나므로 answer에 사람들 수 - 1(본인 제외)만큼 저장해주고 이미 방에 있던 사람들은 +1하여 만난사람을 증가시켜준다. 
  • 모두 입실을 완료했을 때까지 반복한다.

 

고찰

걸린시간 : 2시간

집중력을 잃어서 2시간이나 걸렸다....

구현하고보니 어렵지 않은 문제였는데.. 어렵게 생각해서 처음 풀었을 때 시간초과가 나왔다. 문제풀 때 더 집중해서 풀어야할 거 같다..

 

728x90

댓글