오늘 풀어본 두가지 문제 중 좀 더 가벼운 프로그래머스 스킬 트리 리뷰!
선행 스킬이란 어떤 스킬을 배우기 전에 먼저 배워야 하는 스킬을 뜻합니다.
예를 들어 선행 스킬 순서가 파크 → 라이트닝 볼트 → 썬더
때, 썬더를 배우려면 먼저 라이트닝 볼트를 배워야 하고, 라이트닝 볼트를 배우려면 먼저 스파크를 배워야 합니다.
위 순서에 없는 다른 스킬(힐링 등)은 순서에 상관없이 배울 수 있습니다. 따라서 파크 → 힐링 → 라이트닝 볼트 → 썬더
같은 스킬트리는 가능하지만, 더 → 스파크나 라이트닝 볼트 → 스파크 → 힐링 → 썬더
같은 스킬트리는 불가능합니다.
선행 스킬 순서 skill과 유저들이 만든 스킬트리1를 담은 배열 skill_trees가 매개변수로 주어질 때, 가능한 스킬트리 개수를 return 하는 solution 함수를 작성해주세요.
skill | skill_trees | return |
---|---|---|
"CBD" | ["BACDE", "CBADF", "AECB", "BDA"] | 2 |
아주 간단한 문제이다. 주어진 skill 의 순서대로 글자들이 나열 되었는지만 확인하면된다. 간단한 문제이기 때문에 다양한 방법으로 구현이 가능할 것 같다.
나의 경우에는 주어진 skill 의 순서대로 번호를 짝지어 {'C' - 0}
과 같이map
에 저장하였다.탐색이 진행될 때 바로바로 해당 문자의 순서를 확인할 수 있도록 하기 위함이다.
이후 skill_trees 의 문자열들을 탐색하면서 나온 문자가 map
에 존재하지 않는다면 그대로 탐색을 진행, 존재 한다면 올바르게 나와야 하는 문자의 번호와 일치하는지를 확인해 주었다.
#include <string>
#include <vector>
#include <map>
using namespace std;
int solution(string skill, vector<string> skill_trees) {
int answer = 0;
map<char, int> skill_order;
for (int i = 0; i < skill.size(); ++i) {
skill_order.insert({skill[i], i});
}
for (int i = 0; i < skill_trees.size(); ++i) {
int cur = 0;
bool able = true;
for (int j = 0; j < skill_trees[i].size(); ++j) {
if (skill_order.find(skill_trees[i][j]) == skill_order.end()) continue;
if (skill_order[skill_trees[i][j]] == cur){
cur++;
}else{
able = false;
break;
}
}
if (able) answer++;
}
return answer;
}
import Foundation
extension String {
subscript(idx: Int) -> String? {
guard (0..<count).contains(idx) else {
return nil
}
let target = index(startIndex, offsetBy: idx)
return String(self[target])
}
}
func solution(_ skill:String, _ skill_trees:[String]) -> Int {
var answer = 0
var skill_order : [String : Int] = [:]
for i in 0..<skill.count {
guard let key = skill[i] else {
continue
}
skill_order[key] = i
}
for tree in skill_trees {
var cur = 0
var able = true
for i in 0..<tree.count {
guard let key = tree[i] else {
continue
}
if let value = skill_order[key] {
if value == cur {
cur += 1
continue
}else{
able = false
break
}
}else {
continue
}
}
if able {
answer += 1
}
}
return answer
}