본문 바로가기

컴퓨터 프로그래밍/알고리즘

프로그래머스-스킬트리

https://programmers.co.kr/learn/courses/30/lessons/49993?language=java

 

코딩테스트 연습 - 스킬트리

 

programmers.co.kr

 

<내풀이>

skill_trees 한 요소에 skill을 string 배열로 만들어 요소들을하나씩 확인합니다. skill_tree 문자열 안에 skill의 요소들이 있는지 확인합니다. 그래서 없을 때랑 있을 때는 나눌 수 있습니다. 그 요소가 없을 때에는 마지막일 때는 answer를 하나씩 올리고 for문을 끝낸다. 마지막이 아닐때는 나머지 요소들이 skill_trees의 요소에 있는지 없는지 확인한다. 다 없으면 answer를 하나올립니다. 하나라도 있으면 그냥 for문을 끝냅니다.  이제 포함 되어 있을 때에는 index가 이전 index보다 큰지 확인합니다. 이 과정이 skill의 순서대로 인지 확인하는 작업입니다. 마지막 요소였을 때는 answer++ 해줍니다. 

package al;

public class L16 {
	public static int solution(String skill, String[] skill_trees) {
		int answer = 0;
		String[] skillArray = skill.split("");
		for (int i = 0; i < skill_trees.length; i++) {
			int index = -1;
			for (int j = 0; j < skillArray.length; j++) {
				if (skill_trees[i].indexOf(skillArray[j]) == (-1)) {

					if (j == skillArray.length - 1) {
						answer++;
						break;
					}
					boolean b = true;
					for (int k = j + 1; k < skillArray.length; k++) {
						if (skill_trees[i].indexOf(skillArray[k]) != -1) {
							b = false;
							break;
						}
					}
					if (b) {
						answer++;
					}
					break;

				} else {
					if (index < skill_trees[i].indexOf(skillArray[j])) {
						index = skill_trees[i].indexOf(skillArray[j]);
					} else {
						break;
					}
					if (j == skillArray.length - 1) {

						answer++;
					}
				}

			}
		}
		return answer;
	}

	public static void main(String[] args) {
		String skill = "CBD";
		String[] skill_trees = { "BACDE", "CBADF", "AECB", "BDA" };
		System.out.println(solution(skill, skill_trees));
	}

}

 

<남풀이>

skill에 있는 요소가 skill_trees 요소에 들어 있는지 없는지를 확인하는 것이 아니라, 반대로 skill_trees의 요소의 문자열이 skill에 있는지를 확인하는 방법이다. 이게 더 효율적인 것 같습니다. learningIdx가 배울 점인듯 합니다.  

class Solution {
    public int solution(String skill, String[] skill_trees) {
        int answer = 0;
        for (String skillTree : skill_trees) {
            int learningIdx = 0;
            boolean isAble = true;
            for (char curSkill : skillTree.toCharArray()) {
                int skillIdx = skill.indexOf(curSkill);
                if (skillIdx == -1)
                    continue;
                else if (skillIdx == learningIdx)
                    learningIdx++;
                else {
                    isAble = false;
                    break;
                }
            }
            if (isAble)
                answer++;
        }
        return answer;
    }
}