문제 링크
https://school.programmers.co.kr/learn/courses/30/lessons/49993
프로그래머스
코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.
programmers.co.kr
코드
#include <string>
#include <vector>
using namespace std;
bool isMatchedFromFront(string skill, string order) {
for(int i = 0; i < order.length(); ++i) {
if(skill[i] != order[i]) {
return false;
}
}
return true;
}
int solution(string skill, vector<string> skill_trees) {
int answer = 0;
bool isOrderedSkill['Z' - 'A' + 1] = {false,};
for(const auto& c : skill) {
isOrderedSkill[c - 'A'] = true;
}
for(const auto& st : skill_trees) {
string order = "";
for(const auto& c : st) {
if(isOrderedSkill[c - 'A']) {
order += c;
}
}
if(order.length() == 0 || isMatchedFromFront(skill, order)) {
answer++;
}
}
return answer;
}
접근법
선행 스킬이 필요한 스킬들만 뽑아낸 다음에 이 스킬들이 주어진 선행 스킬 순서를 지키고 있는지 확인한다. isOrderedSkill 배열을 미리 만들어두어 어떤 스킬이 선행 스킬이 필요한 것인지 빠르게 확인할 수 있게 한다.
위 코드에서 order문자열은 skill_trees의 요소 중 선행 스킬이 필요한 스킬들만 모인 문자열이다. 이 문자열이 선행스킬을 배우는 순서를 지키고 있는지는 isMatchedFromFront()가 검사한다.
'algorithm & data structure' 카테고리의 다른 글
[BOJ] 2565 전깃줄/Dynamic Programming/이분 탐색/최장 증가 부분 수열(LIS)/C++ 풀이 (2) | 2024.03.28 |
---|---|
[BOJ] 포도주 시식 / Dynamic programming (0) | 2024.03.22 |
[프로그래머스] 하노이의 탑 / 재귀 / C++ 풀이 (2) | 2023.10.22 |
[프로그래머스] N개의 최소공배수 / 정수론 / 유클리드 호제법 (0) | 2023.10.22 |
[프로그래머스] 이중 우선 순위 큐 / C++ 풀이 / 자료구조 (1) | 2023.10.17 |