알고리즘/programmers

[프로그래머스]스킬트리[JAVA, 자바]

장그래 2021. 3. 26. 14:41
반응형

문제 설명

선행 스킬이란 어떤 스킬을 배우기 전에 먼저 배워야 하는 스킬을 뜻합니다.

예를 들어 선행 스킬 순서가 스파크 → 라이트닝 볼트 → 썬더일때, 썬더를 배우려면 먼저 라이트닝 볼트를 배워야 하고, 라이트닝 볼트를 배우려면 먼저 스파크를 배워야 합니다.

위 순서에 없는 다른 스킬(힐링 등)은 순서에 상관없이 배울 수 있습니다. 따라서 스파크 → 힐링 → 라이트닝 볼트 → 썬더와 같은 스킬트리는 가능하지만, 썬더 → 스파크나 라이트닝 볼트 → 스파크 → 힐링 → 썬더와 같은 스킬트리는 불가능합니다.

선행 스킬 순서 skill과 유저들이 만든 스킬트리1를 담은 배열 skill_trees가 매개변수로 주어질 때, 가능한 스킬트리 개수를 return 하는 solution 함수를 작성해주세요.

풀이 방법

  • indexof와 arrlist를 이용해 풀었다.

  • 먼저 스킬트리의 문자열에서 indexof를 사용해서, 현재 스킬의 index위치를 구한다.

  • 위치를 구한 뒤 arrlist가 오름차순으로 정렬되어 있다면, index가 순서대로 위치하고 있는 것을 의미한다.

  • 만약 스킬트리에서 선행 스킬이 없을 경우 최대 값을 add해줘 오름차순으로 위치하는 것을 막으면 된다.

    알아야되는 개념

  • arraylist

  • string 메소드

import java.util.*;
class Solution {
    int check(ArrayList<Integer> arr){
        for(int i=0;i<arr.size();i++){
            for(int j=i+1;j<arr.size();j++)
                if(arr.get(i) > arr.get(j)) return 0;
        }
        return 1;
    }

    public int solution(String skill, String[] skill_trees) {
        int answer = 0;
        ArrayList<Integer> arr = new ArrayList<>();

        for(int i=0;i< skill_trees.length;i++){
            for(int j=0;j<skill.length();j++){
                if(skill_trees[i].indexOf(skill.charAt(j))>=0){
                    arr.add(skill_trees[i].indexOf(skill.charAt(j)));
                }
                else
                    arr.add(skill_trees[i].length());

            }
            if(check(arr) == 1)
                answer++;
            while(!arr.isEmpty()) arr.remove(0);
        }
        return answer;
    }
}
반응형