πŸ’­ Problem Solving/C++

[ν”„λ‘œκ·Έλž˜λ¨ΈμŠ€][C++] μŠ€ν‚¬νŠΈλ¦¬

0=2. 2024. 5. 31. 20:52

문제

https://school.programmers.co.kr/learn/courses/30/lessons/49993

 

ν”„λ‘œκ·Έλž˜λ¨ΈμŠ€

μ½”λ“œ μ€‘μ‹¬μ˜ 개발자 μ±„μš©. μŠ€νƒ 기반의 ν¬μ§€μ…˜ λ§€μΉ­. ν”„λ‘œκ·Έλž˜λ¨ΈμŠ€μ˜ 개발자 λ§žμΆ€ν˜• ν”„λ‘œν•„μ„ λ“±λ‘ν•˜κ³ , λ‚˜μ™€ 기술 ꢁ합이 잘 λ§žλŠ” 기업듀을 λ§€μΉ­ λ°›μœΌμ„Έμš”.

programmers.co.kr

 

풀이

1️⃣ queue

1. μ•ŒνŒŒλ²³ 개수(26) 크기의 λ°°μ—΄λ‘œ μˆœμ„œμ™€ μƒκ΄€μ—†λŠ” μŠ€ν‚¬(true)κ³Ό μ„ ν–‰ μŠ€ν‚¬μ΄ ν•„μš”ν•œ μŠ€ν‚¬(false)을 ν‘œμ‹œν•œλ‹€.
2. μŠ€ν‚¬μ˜ μˆœμ„œ 비ꡐλ₯Ό μœ„ν•΄ νλ₯Ό μƒμ„±ν•˜μ—¬ skill 값을 ν• λ‹Ήν•œλ‹€.
3. skill_trees λ‚΄μ˜ λ¬Έμžμ—΄ 탐색
    (1) μ„ ν–‰ μŠ€ν‚¬μ΄ ν•„μš”μ—†λŠ” μŠ€ν‚¬μ€ λ¬΄μ‹œν•œλ‹€.
    (2) μ„ ν–‰ μŠ€ν‚¬μ΄ ν•„μš”ν•œ μŠ€ν‚¬μΌ 경우, 큐λ₯Ό μ΄μš©ν•΄ μˆœμ„œκ°€ 같은지 ν™•μΈν•œλ‹€. (queue.front()와 비ꡐ)
         - μˆœμ„œκ°€ κ°™μœΌλ©΄ νμ—μ„œ ν•΄λ‹Ή 문자λ₯Ό μ œκ±°ν•œλ‹€.
         - μˆœμ„œκ°€ λ‹€λ₯΄λ©΄ answer - 1 ν•œ ν›„, λ‹€μŒ λ¬Έμžμ—΄μ„ νƒμƒ‰ν•œλ‹€.

 

🚨 skill_trees의 λ¬Έμžμ—΄μ„ 탐색할 λ•Œλ§ˆλ‹€ 큐λ₯Ό μ΄ˆκΈ°ν™”ν•΄μ•Ό ν•œλ‹€.

 

2️⃣ string::find()

1. skill_trees λ‚΄μ˜ λ¬Έμžμ—΄μ„ νƒμƒ‰ν•˜λ©΄μ„œ skillκ³Ό 같은 λ¬Έμžκ°€ μžˆλŠ”μ§€ string의 find ν•¨μˆ˜λ₯Ό μ΄μš©ν•΄ μ°ΎλŠ”λ‹€. 
    같은 λ¬Έμžκ°€ 있으면 이λ₯Ό string s에 μ €μž₯ν•œλ‹€.

2. s와 skill의 μˆœμ„œλ₯Ό λΉ„κ΅ν•œλ‹€.
    μˆœμ„œκ°€ λ‹€λ₯΄λ©΄ answer - 1 ν•œ ν›„, λ‹€μŒ λ¬Έμžμ—΄μ„ νƒμƒ‰ν•œλ‹€.

 

🚨 skill_trees의 λ¬Έμžμ—΄μ„ 탐색할 λ•Œλ§ˆλ‹€ 같은 값을 μ €μž₯ν•˜λŠ” string sλ₯Ό μ΄ˆκΈ°ν™”ν•΄μ•Ό ν•œλ‹€.

🚨 μˆœμ„œλ₯Ό 비ꡐ할 λ•Œ skill이 μ•„λ‹Œ s의 길이만큼 비ꡐ해야 ν•œλ‹€. μ„ ν–‰ μŠ€ν‚¬ λ‚΄μ˜ λͺ¨λ“  μŠ€ν‚¬μ„ λ°°μš°μ§€ μ•Šμ•˜μ–΄λ„, μˆœμ„œλ₯Ό λ”°λ₯΄λ©΄ 쑰건을 λ§Œμ‘±ν•˜κΈ° 떄문이닀.

μ½”λ“œ

1️⃣ queue

#include <iostream>
#include <vector>
#include <queue>

using namespace std;

int solution(string skill, vector<string> skill_trees) {
    int answer = skill_trees.size();
    vector<bool> alphabet(26, true);    // μˆœμ„œμ™€ μƒκ΄€μ—†λŠ” μŠ€ν‚¬ μ €μž₯

    for (char c: skill) {
        alphabet[c - 'A'] = false;  // μ„ ν–‰ μŠ€ν‚¬ ν•„μš”ν•œ μŠ€ν‚¬: false
    }

    for (string skill_tree: skill_trees) {
        queue<char> skill_queue;    // μ„ ν–‰ μŠ€ν‚¬
        for (char c: skill) { // μ„ ν–‰ μŠ€ν‚¬ μ‚½μž…
            skill_queue.push(c);
        }

        for (char c: skill_tree) {
            if (alphabet[c - 'A']) {  // μ„ ν–‰ μŠ€ν‚¬ ν•„μš” μ—†μŒ
                continue;
            } else if (c == skill_queue.front()) {   // μ„ ν–‰ μŠ€ν‚¬ 쑰건 만쑱
                skill_queue.pop();
            } else {    // μ„ ν–‰ μŠ€ν‚¬ 쑰건 뢈만쑱
                answer--;
                break;
            }
        }
    }

    return answer;
}

 

2️⃣ string::find()

#include <iostream>
#include <vector>

using namespace std;

int solution(string skill, vector<string> skill_trees) {
    int answer = skill_trees.size();
    string s = "";
    
    for(string skill_tree: skill_trees){
        for(char c: skill_tree){
            // skill에 skill_tree와 같은 값이 있으면 μ €μž₯
            if(skill.find(c) != string::npos){  
                s.push_back(c);
            }
        }
        
        for(int i = 0; i < s.length(); i++){
            if(skill[i] != s[i]){   // μˆœμ„œκ°€ λ‹€λ₯΄λ©΄ λΆˆκ°€λŠ₯ν•œ μŠ€ν‚¬νŠΈλ¦¬
                answer--;
                break;
            }
        }
        
        s = ""; // μ΄ˆκΈ°ν™”
    }
    
    return answer;
}