스킬트리
[문제 Link] https://programmers.co.kr/learn/courses/30/lessons/49993
문제 설명
선행 스킬이란 어떤 스킬을 배우기 전에 먼저 배워야 하는 스킬을 뜻합니다.
예를 들어 선행 스킬 순서가 스파크 → 라이트닝 볼트 → 썬더일때, 썬더를 배우려면 먼저 라이트닝 볼트를 배워야 하고, 라이트닝 볼트를 배우려면 먼저 스파크를 배워야 합니다.
위 순서에 없는 다른 스킬(힐링 등)은 순서에 상관없이 배울 수 있습니다. 따라서 스파크 → 힐링 → 라이트닝 볼트 → 썬더와 같은 스킬트리는 가능하지만, 썬더 → 스파크나 라이트닝 볼트 → 스파크 → 힐링 → 썬더와 같은 스킬트리는 불가능합니다.
선행 스킬 순서 skill과 유저들이 만든 스킬트리1를 담은 배열 skill_trees가 매개변수로 주어질 때, 가능한 스킬트리 개수를 return 하는 solution 함수를 작성해주세요.
제한사항
- 스킬은 알파벳 대문자로 표기하며, 모든 문자열은 알파벳 대문자로만 이루어져 있습니다.
- 스킬 순서와 스킬트리는 문자열로 표기합니다.
- 예를 들어, C → B → D 라면 “CBD”로 표기합니다
- 선행 스킬 순서 skill의 길이는 1 이상 26 이하이며, 스킬은 중복해 주어지지 않습니다.
- skill_trees는 길이 1 이상 20 이하인 배열입니다.
- skill_trees의 원소는 스킬을 나타내는 문자열입니다.
- skill_trees의 원소는 길이가 2 이상 26 이하인 문자열이며, 스킬이 중복해 주어지지 않습니다.
입출력 예
skill | skill_trees | return |
---|---|---|
“CBD” | [“BACDE”, “CBADF”, “AECB”, “BDA”] | 2 |
입출력 예 설명
- “BACDE”: B 스킬을 배우기 전에 C 스킬을 먼저 배워야 합니다. 불가능한 스킬트립니다.
- “CBADF”: 가능한 스킬트리입니다.
- “AECB”: 가능한 스킬트리입니다.
- “BDA”: B 스킬을 배우기 전에 C 스킬을 먼저 배워야 합니다. 불가능한 스킬트리입니다.
로직
게임을 플레이하다 보면 선행스킬이라는 개념을 묻는 문제이다. 선행 스킬이란 현재 스킬을 배우기 위해 이전의 스킬을 배워야한다는 개념이다. skill_trees 배열의 문자열을 보고 해당 문자열이 선행스킬의 개념을 지켜졌는지 확인하면 된다.
-
skill 문자열의 길이만큼의 bool 배열을 만든다. 배열에는 모두 false로 초기화한다.
-
skill_trees 배열을 for문을 통해 반복하며 원자 하나하나 확인한다.
-
배열 안의 문자열을 첫번째 부터 확인하고, 선행스킬이 없는 스킬부터 확인하여 true로 만든다.
-
다음 문자를 확인하고, 만약 선행 스킬을 배우지 않았다면, bool 배열을 그대로 두고 선행 스킬을 배웠다면, bool 배열에 해당 index를 true로 만든다.
-
만약 모든 bool 배열이 true라면 answer +1 해준다.
-
bool 배열을 초기화시킨 후 배열의 마지막 인덱스까지 반복한다.
전체 코드
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Text.RegularExpressions;
class Solution
{
public static int solution(string skill, string[] skill_trees)
{
int answer = 0;
int len = skill_trees.Length;
bool[] flags = new bool[skill.Length];
for(int i =0;i<flags.Length;i++)
flags[i] = false;
bool flag = true;
for(int i =0;i<len;i++)
{
for(int j =0;j<skill_trees[i].Length;j++)
{
if(skill.Contains(skill_trees[i][j]))
{
if(skill.IndexOf(skill_trees[i][j])!=0)
{
if (flags[skill.IndexOf(skill_trees[i][j]) - 1])
{
flags[skill.IndexOf(skill_trees[i][j])] = true;
}
else
flag = false;
}
else
{
flags[0] = true;
}
}
}
if(flag) answer++;
for(int k =0;k<flags.Length;k++)
flags[k] = false;
flag =true;
}
return answer;
}
public static void Main(string[] args)
{
string skill = "CBD";
string[] skill_trees = new string[] {"BACDE", "CBADF", "AECB", "BDA"};
Console.WriteLine(solution(skill,skill_trees));
}
}