๐Ÿ’ญ 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;
}