[μ½”λ”©ν…ŒμŠ€νŠΈ μ€€λΉ„] 카카였 2020 Recruitment 문제 :: μ˜€ν”ˆμ±„νŒ…λ°©

μ˜€ν”ˆμ±„νŒ…λ°©

문제

μΉ΄μΉ΄μ˜€ν†‘ μ˜€ν”ˆμ±„νŒ…λ°©μ—μ„œλŠ” μΉœκ΅¬κ°€ μ•„λ‹Œ μ‚¬λžŒλ“€κ³Ό λŒ€ν™”λ₯Ό ν•  수 μžˆλŠ”λ°, 본래 λ‹‰λ„€μž„μ΄ μ•„λ‹Œ κ°€μƒμ˜ λ‹‰λ„€μž„μ„ μ‚¬μš©ν•˜μ—¬ μ±„νŒ…λ°©μ— λ“€μ–΄κ°ˆ 수 μžˆλ‹€.

μ‹ μž…μ‚¬μ›μΈ κΉ€ν¬λ£¨λŠ” μΉ΄μΉ΄μ˜€ν†‘ μ˜€ν”ˆ μ±„νŒ…λ°©μ„ κ°œμ„€ν•œ μ‚¬λžŒμ„ μœ„ν•΄, λ‹€μ–‘ν•œ μ‚¬λžŒλ“€μ΄ λ“€μ–΄μ˜€κ³ , λ‚˜κ°€λŠ” 것을 μ§€μΌœλ³Ό 수 μžˆλŠ” κ΄€λ¦¬μžμ°½μ„ λ§Œλ“€κΈ°λ‘œ ν–ˆλ‹€. μ±„νŒ…λ°©μ— λˆ„κ΅°κ°€ λ“€μ–΄μ˜€λ©΄ λ‹€μŒ λ©”μ‹œμ§€κ°€ 좜λ ₯λœλ‹€.

[λ‹‰λ„€μž„]λ‹˜μ΄ λ“€μ–΄μ™”μŠ΅λ‹ˆλ‹€.

μ±„νŒ…λ°©μ—μ„œ λˆ„κ΅°κ°€ λ‚˜κ°€λ©΄ λ‹€μŒ λ©”μ‹œμ§€κ°€ 좜λ ₯λœλ‹€.

[λ‹‰λ„€μž„]λ‹˜μ΄ λ‚˜κ°”μŠ΅λ‹ˆλ‹€.

μ±„νŒ…λ°©μ—μ„œ λ‹‰λ„€μž„μ„ λ³€κ²½ν•˜λŠ” 방법은 λ‹€μŒκ³Ό 같이 두 가지이닀.

  • μ±„νŒ…λ°©μ„ λ‚˜κ°„ ν›„, μƒˆλ‘œμš΄ λ‹‰λ„€μž„μœΌλ‘œ λ‹€μ‹œ λ“€μ–΄κ°„λ‹€.
  • μ±„νŒ…λ°©μ—μ„œ λ‹‰λ„€μž„μ„ λ³€κ²½ν•œλ‹€.

λ‹‰λ„€μž„μ„ λ³€κ²½ν•  λ•ŒλŠ” 기쑴에 μ±„νŒ…λ°©μ— 좜λ ₯λ˜μ–΄ 있던 λ©”μ‹œμ§€μ˜ λ‹‰λ„€μž„λ„ μ „λΆ€ λ³€κ²½λœλ‹€.

예λ₯Ό λ“€μ–΄, μ±„νŒ…λ°©μ— Muzi와 ProdoλΌλŠ” λ‹‰λ„€μž„μ„ μ‚¬μš©ν•˜λŠ” μ‚¬λžŒμ΄ μˆœμ„œλŒ€λ‘œ λ“€μ–΄μ˜€λ©΄ μ±„νŒ…λ°©μ—λŠ” λ‹€μŒκ³Ό 같이 λ©”μ‹œμ§€κ°€ 좜λ ₯λœλ‹€.

Muziλ‹˜μ΄ λ“€μ–΄μ™”μŠ΅λ‹ˆλ‹€.
Prodoλ‹˜μ΄ λ“€μ–΄μ™”μŠ΅λ‹ˆλ‹€.

μ±„νŒ…λ°©μ— 있던 μ‚¬λžŒμ΄ λ‚˜κ°€λ©΄ μ±„νŒ…λ°©μ—λŠ” λ‹€μŒκ³Ό 같이 λ©”μ‹œμ§€κ°€ λ‚¨λŠ”λ‹€.

Muziλ‹˜μ΄ λ“€μ–΄μ™”μŠ΅λ‹ˆλ‹€.
Prodoλ‹˜μ΄ λ“€μ–΄μ™”μŠ΅λ‹ˆλ‹€.
Muziλ‹˜μ΄ λ‚˜κ°”μŠ΅λ‹ˆλ‹€.

Muziκ°€ λ‚˜κ°„ν›„ λ‹€μ‹œ λ“€μ–΄μ˜¬ λ•Œ, Prodo λΌλŠ” λ‹‰λ„€μž„μœΌλ‘œ λ“€μ–΄μ˜¬ 경우 기쑴에 μ±„νŒ…λ°©μ— λ‚¨μ•„μžˆλ˜ Muzi도 Prodo둜 λ‹€μŒκ³Ό 같이 λ³€κ²½λœλ‹€.

Prodoλ‹˜μ΄ λ“€μ–΄μ™”μŠ΅λ‹ˆλ‹€.
Prodoλ‹˜μ΄ λ“€μ–΄μ™”μŠ΅λ‹ˆλ‹€.
Prodoλ‹˜μ΄ λ‚˜κ°”μŠ΅λ‹ˆλ‹€.
Prodoλ‹˜μ΄ λ“€μ–΄μ™”μŠ΅λ‹ˆλ‹€.

μ±„νŒ…λ°©μ€ 쀑볡 λ‹‰λ„€μž„μ„ ν—ˆμš©ν•˜κΈ° λ•Œλ¬Έμ—, ν˜„μž¬ μ±„νŒ…λ°©μ—λŠ” ProdoλΌλŠ” λ‹‰λ„€μž„μ„ μ‚¬μš©ν•˜λŠ” μ‚¬λžŒμ΄ 두 λͺ…이 μžˆλ‹€. 이제, μ±„νŒ…λ°©μ— 두 번째둜 λ“€μ–΄μ™”λ˜ Prodoκ°€ Ryan으둜 λ‹‰λ„€μž„μ„ λ³€κ²½ν•˜λ©΄ μ±„νŒ…λ°© λ©”μ‹œμ§€λŠ” λ‹€μŒκ³Ό 같이 λ³€κ²½λœλ‹€.

Prodoλ‹˜μ΄ λ“€μ–΄μ™”μŠ΅λ‹ˆλ‹€.
Ryanλ‹˜μ΄ λ“€μ–΄μ™”μŠ΅λ‹ˆλ‹€.
Prodoλ‹˜μ΄ λ‚˜κ°”μŠ΅λ‹ˆλ‹€.
Prodoλ‹˜μ΄ λ“€μ–΄μ™”μŠ΅λ‹ˆλ‹€.

μ±„νŒ…λ°©μ— λ“€μ–΄μ˜€κ³  λ‚˜κ°€κ±°λ‚˜, λ‹‰λ„€μž„μ„ λ³€κ²½ν•œ 기둝이 λ‹΄κΈ΄ λ¬Έμžμ—΄ λ°°μ—΄ recordκ°€ λ§€κ°œλ³€μˆ˜λ‘œ μ£Όμ–΄μ§ˆ λ•Œ, λͺ¨λ“  기둝이 처리된 ν›„, μ΅œμ’…μ μœΌλ‘œ 방을 κ°œμ„€ν•œ μ‚¬λžŒμ΄ 보게 λ˜λŠ” λ©”μ‹œμ§€λ₯Ό λ¬Έμžμ—΄ λ°°μ—΄ ν˜•νƒœλ‘œ return ν•˜λ„λ‘ solution ν•¨μˆ˜λ₯Ό μ™„μ„±ν•˜λΌ.

μ œν•œμ‚¬ν•­

  • recordλŠ” λ‹€μŒκ³Ό 같은 λ¬Έμžμ—΄μ΄ λ‹΄κΈ΄ 배열이며, κΈΈμ΄λŠ” 1 이상 100,000 μ΄ν•˜μ΄λ‹€.
  • λ‹€μŒμ€ record에 λ‹΄κΈ΄ λ¬Έμžμ—΄μ— λŒ€ν•œ μ„€λͺ…이닀.
    • λͺ¨λ“  μœ μ €λŠ” [μœ μ € 아이디]둜 κ΅¬λΆ„ν•œλ‹€.
    • [μœ μ € 아이디] μ‚¬μš©μžκ°€ [λ‹‰λ„€μž„]으둜 μ±„νŒ…λ°©μ— μž…μž₯ - Enter [μœ μ € 아이디] [λ‹‰λ„€μž„] (ex. Enter uid1234 Muzi)
    • [μœ μ € 아이디] μ‚¬μš©μžκ°€ μ±„νŒ…λ°©μ—μ„œ 퇴μž₯ - Leave [μœ μ € 아이디] (ex. Leave uid1234)
    • [μœ μ € 아이디] μ‚¬μš©μžκ°€ λ‹‰λ„€μž„μ„ [λ‹‰λ„€μž„]으둜 λ³€κ²½ - Change [μœ μ € 아이디] [λ‹‰λ„€μž„] (ex. Change uid1234 Muzi)
    • 첫 λ‹¨μ–΄λŠ” Enter, Leave, Change 쀑 ν•˜λ‚˜μ΄λ‹€.
    • 각 λ‹¨μ–΄λŠ” 곡백으둜 κ΅¬λΆ„λ˜μ–΄ 있으며, μ•ŒνŒŒλ²³ λŒ€λ¬Έμž, μ†Œλ¬Έμž, 숫자둜만 μ΄λ£¨μ–΄μ Έμžˆλ‹€.
    • μœ μ € 아이디와 λ‹‰λ„€μž„μ€ μ•ŒνŒŒλ²³ λŒ€λ¬Έμž, μ†Œλ¬Έμžλ₯Ό κ΅¬λ³„ν•œλ‹€.
    • μœ μ € 아이디와 λ‹‰λ„€μž„μ˜ κΈΈμ΄λŠ” 1 이상 10 μ΄ν•˜μ΄λ‹€.
    • μ±„νŒ…λ°©μ—μ„œ λ‚˜κ°„ μœ μ €κ°€ λ‹‰λ„€μž„μ„ λ³€κ²½ν•˜λŠ” λ“± 잘λͺ» 된 μž…λ ₯은 주어지지 μ•ŠλŠ”λ‹€.

μ½”λ“œ

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

using namespace std;

void splitArr(string str, vector<string>& result){
    string a=""; int i=0;
    while(i<str.size()){
        if(str[i]!=' ')
            a+=str[i];
        else{
            result.push_back(a);
            a="";
        }
        i++;
    }
    result.push_back(a);
    return;
}

vector<string> solution(vector<string> record) {
    vector<string> answer;
    map<string, string> Changes;
    int size = record.size();

    // make map of uid
    vector<string> splitResult; // c++은 GCκ°€ μ—†μŒ => ν•˜λ‚˜μ˜ μžμ› ν™œμš©
    for(int i=0; i<size; i++){
        splitResult.clear();
        splitArr(record[i], splitResult);
        if(!splitResult[0].compare("Change")){ // μ±„νŒ…λ°©μ—μ„œ λ‹‰λ„€μž„μ„ λ³€κ²½ν•œλ‹€.
            Changes[splitResult[1]]=splitResult[2];
        }else if(!splitResult[0].compare("Enter")){ // μ±„νŒ…λ°©μ„ λ‚˜κ°„ ν›„, μƒˆλ‘œμš΄ λ‹‰λ„€μž„μœΌλ‘œ λ‹€μ‹œ λ“€μ–΄κ°„λ‹€.
            Changes[splitResult[1]]=splitResult[2];
        }
    }

    for(int i=0; i<size; i++){
        splitResult.clear();
        splitArr(record[i], splitResult);

        if(!splitResult[0].compare("Enter"))
                answer.push_back(Changes[splitResult[1]]+"λ‹˜μ΄ λ“€μ–΄μ™”μŠ΅λ‹ˆλ‹€.");
        else if(!splitResult[0].compare("Leave"))
            answer.push_back(Changes[splitResult[1]]+"λ‹˜μ΄ λ‚˜κ°”μŠ΅λ‹ˆλ‹€.");
    }

    return answer;
}

 

풀이

μš°μ„ , μ£Όμ–΄μ§€λŠ” record의 κΈΈμ΄λŠ” μ΅œλŒ€ 10^5이닀.

κ·Έλ ‡λ‹€λ©΄ 쀑볡 loopλŠ” 생기면 μ•ˆλ˜κ³ , λ³‘λ ¬λ‘œ μ‚¬μš©ν•  μˆ˜λ°–μ— μ—†μœΌλ©° 곡간적인 μΈ‘λ©΄μ—μ„œλ„ κ³ λ €λ₯Ό ν•΄μ•Όν•œλ‹€.

μ²˜μŒμ— λŒ€μΆ© 짜본 문제 ν•΄κ²° ν”„λ‘œμ„ΈμŠ€λŠ” λ‹€μŒκ³Ό κ°™λ‹€.

  1. 일단 split ν•˜μ—¬ λͺ…λ Ήμ–΄, userid, λ‹‰λ„€μž„μ„ λΆ„λ¦¬ν•œλ‹€.
  2. λͺ…λ Ήμ–΄ λ³„λ‘œ λΆ„κΈ°ν•˜μ—¬ Enter와 Changeμ—μ„œ λ‹‰λ„€μž„μ΄ λ³€κ²½λ˜μ—ˆμ„ λ•Œ, ν•΄λ‹Ή uid에 μ €μž₯ν•œλ‹€.
  3. Enter와 Leave λͺ…λ Ήμ–΄λ₯Ό λΆ„κΈ°ν•˜μ—¬ 좜λ ₯ν•˜λ©°, uid에 ν•΄λ‹Ήν•˜λŠ” λ‹‰λ„€μž„μ„ μ‚½μž…ν•œλ‹€.

κ²°κ΅­ λ‹‰λ„€μž„μ€ ν•΄λ‹Ή uid에 κ°€μž₯ λ§ˆμ§€λ§‰μœΌλ‘œ λΆ€μ—¬λœ 것이 좜λ ₯λœλ‹€. λ”°λΌμ„œ, uidλ₯Ό key둜 두고 λ‹‰λ„€μž„μ„ value둜 κ°€μ§€λŠ” map을 μƒμ„±ν•˜μ—¬ κ΄€λ¦¬ν•˜λ©΄ νŽΈν•  것이닀.

μ‹œκ°„λ³΅μž‘λ„ μΈ‘λ©΄μ—μ„œλ„ 10^5이 2번만 돌면 되기 λ•Œλ¬Έμ— 문제 μ—†λ‹€.


μ½”λ“œμ™€ ν•¨κ»˜ κ΅¬ν˜„κ³Όμ •μ„ μ„€λͺ…ν•΄λ³΄μž.

  1. c++μ—μ„œ splitν•˜λŠ” string 헀더 ν•¨μˆ˜κ°€ μ—†μ—ˆλ‹€. λ”°λΌμ„œ 직접 κ΅¬ν˜„ν–ˆλ‹€.
void splitArr(string str, vector<string>& result){
    string a=""; int i=0;
    while(i<str.size()){
        if(str[i]!=' ')
            a+=str[i];
        else{
            result.push_back(a);
            a="";
        }
        i++;
    }
    result.push_back(a);
    return;
}

vector<string> splitResult; // c++은 GCκ°€ μ—†μŒ => ν•˜λ‚˜μ˜ μžμ› ν™œμš©
for(int i=0; i<size; i++){
    splitResult.clear();
    splitArr(record[i], splitResult);
}

이 κ³Όμ •μ—μ„œ μ•„λž˜μ˜ ν˜ΈμΆœμ½”λ“œλ₯Ό 보면 λ§€κ°œλ³€μˆ˜λ‘œ forλ¬Έ λ‚΄μ˜ μ§€μ—­λ³€μˆ˜κ°€ μ•„λ‹Œ μ „μ—­λ³€μˆ˜λ₯Ό λ„˜κΈ°κ³  μžˆλ‹€. μ „μ—­λ³€μˆ˜λ₯Ό clearν•˜κ³  계속 λ‹€μ‹œ μ‚¬μš©ν•¨μœΌλ‘œμ¨, GCκ°€ μ—†λŠ” c++이 λ©”λͺ¨λ¦¬λ₯Ό λ‚­λΉ„ν•˜μ§€ μ•Šλ„λ‘ ν–ˆλ‹€.

  1. map 자료ꡬ쑰 이용
if(!splitResult[0].compare("Change")){ // μ±„νŒ…λ°©μ—μ„œ λ‹‰λ„€μž„μ„ λ³€κ²½ν•œλ‹€.
            Changes[splitResult[1]]=splitResult[2];
        }else if(!splitResult[0].compare("Enter")){ // μ±„νŒ…λ°©μ„ λ‚˜κ°„ ν›„, μƒˆλ‘œμš΄ λ‹‰λ„€μž„μœΌλ‘œ λ‹€μ‹œ λ“€μ–΄κ°„λ‹€.
            Changes[splitResult[1]]=splitResult[2];
        }

맡 자료ꡬ쑰λ₯Ό μ΄μš©ν•˜λ©΄, νŠΉμ • key에 λŒ€ν•œ value의 갱신을 μ†μ‰½κ²Œ κ΅¬ν˜„ν•  수 μžˆλ‹€. 기쑴에 keyκ°€ μ‘΄μž¬ν•˜λŠ”μ§€ μ•„λ‹Œμ§€λ₯Ό λ”°μ§ˆ ν•„μš”λ„ μ—†μ–΄μ„œ μ’‹λ‹€.

  1. 좜λ ₯
for(int i=0; i<size; i++){
        splitResult.clear();
        splitArr(record[i], splitResult);

        if(!splitResult[0].compare("Enter"))
                answer.push_back(Changes[splitResult[1]]+"λ‹˜μ΄ λ“€μ–΄μ™”μŠ΅λ‹ˆλ‹€.");
        else if(!splitResult[0].compare("Leave"))
            answer.push_back(Changes[splitResult[1]]+"λ‹˜μ΄ λ‚˜κ°”μŠ΅λ‹ˆλ‹€.");
    }

채점 κ²°κ³Ό

μ•„λž˜μͺ½μ— 무슨 ν…ŒμΌ€λ₯Ό 넣어둔거냐 카카였..

 

μ£Όμ˜ν•  것

compareν•¨μˆ˜λ₯Ό strcmp둜 μ‚¬μš©ν•˜λ €κ³  cstring 헀더λ₯Ό importν•΄λ΄€μ§€λ§Œ μ‚¬μš©λ˜μ§€ μ•Šμ•˜λ‹€. string ν—€λ”μ˜ str1.compare(str2) ν•¨μˆ˜λ₯Ό μ΄μš©ν•˜λ©΄ λœλ‹€. λ‹€λ§Œ, 이 ν•¨μˆ˜λŠ” μΌμΉ˜ν–ˆμ„ λ•Œ 0, λΆˆμΌμΉ˜ν–ˆμ„ λ•Œ -1을 λ°˜ν™˜ν•˜λ―€λ‘œ 0 λ°˜ν™˜μ‹œ μ°Έμ΄λΌλŠ” 것을 μ•Œκ³  μžˆμ–΄μ•Όν•œλ‹€.

 

λ‹€λ₯Έ μ‚¬λžŒμ˜ 풀이

for(string input:record)
    {
        stringstream ss(input);
        ss>>command;
        ss>>uid;
        if(command=="Enter" || command=="Change")
        {
            ss>>ID;
            m[uid]=ID;
        }
    }
  1. for문을 foreach문의 ν˜•νƒœλ‘œ μ“΄ 것
  2. stringstream을 μ΄μš©ν•˜μ—¬ (sstream 헀더 ν•¨μˆ˜) >> μ—°μ‚°μžλ‘œ μ†μ‰½κ²Œ split을 κ΅¬ν˜„ν•œ 것
λ°˜μ‘ν˜•