프로그래머스 Summer/Winter Coding(~2018) 스킬트리 [JAVA] - 22년 9월 18일

Denia·2022년 9월 18일
0

코딩테스트 준비

목록 보기
72/201
post-custom-banner
package com.company;

class Solution {
    public int solution(String skill, String[] skill_trees) {
        //answer 변수 선언
        int answer = 0;

        //모든 스킬 트리에 대해서 스킬이 올바르게 찍혔는지 테스트
        for (String skill_tree : skill_trees) {
            //모든 스킬의 찍힌 순서를 알아보기 위해서 skillIndexArr 를 선언
            int[] skillIndexArr = new int[skill.length()];
            //올바르게 찍힌 스킬인지 확인해줄 flag
            boolean rightSkillTreeFlag = true;

            //skill_tree에서 skill 이 어떤 순서로 찍혔는지 확인
            for (int i = 0; i < skill.length(); i++) {
                //처음으로 찍혀야 하는 스킬 선언
                char eachSkill = skill.charAt(i);
                //skill_tree 에서 몇번째로 찍혔는지 확인
                int eachSkillIndex = skill_tree.indexOf(eachSkill);

                //구해진 값을 skillIndexArr 에 저장
                skillIndexArr[i] = eachSkillIndex;
            }

            //skillIndexArr 에 찍혀진 값을 바탕으로 올바르게 찍힌 스킬인지 확인한다.
                //Index가 OutOfRangeError 를 발생하는 것을 막기 위해서 skill.length() -1 까지만 for문을 돌린다.
            for (int i = 0; i < skill.length() - 1; i++) {
                //선행스킬 중 현재 스킬
                int curSkillIdx = skillIndexArr[i];
                //선행스킬 중 다음 스킬
                int nextSkillIdx = skillIndexArr[i + 1];

                //올바른 스킬 트리가 아닌 경우 rightSkillTreeFlag 를 false 로 변환한 후 for문을 빠져나간다.
                if (isNotRightSkillTree(curSkillIdx, nextSkillIdx)) {
                    rightSkillTreeFlag = false;
                    break;
                }
            }

            //올바른 스킬 트리 인 경우만 answer를 업데이트
            if(rightSkillTreeFlag){
                answer++;
            }
        }

        return answer;
    }

    //현재 스킬이 skill_tree 에 존재하는지 확인
    private boolean isExistInSkillTree(int skillIndex){
        return skillIndex != -1;
    }

    //매개변수로 들어간 모든 스킬이 skill_tree 에 존재하는지 확인
    private boolean isAllExistInSkillTree(int skillIdx1 , int skillIdx2){
        return skillIdx1 != -1 && skillIdx2 != -1;
    }

    //잘못된 순서로 찍힌 스킬인지 확인
    private boolean isWrongOrderSkillTree(int curSkillIndex , int nextSkillIndex){
        //모든 스킬이 존재하는데 후행 스킬이 먼저 찍힌 경우 잘못된 순서로 찍힌 스킬
        return isAllExistInSkillTree(curSkillIndex, nextSkillIndex) &&
                curSkillIndex - nextSkillIndex > 0;
    }

    //올바른 스킬트리가 맞는지 확인
        //1. 선행스킬이 존재하지 않는데 후행스킬이 존재하는 경우 올바른 스킬트리가 아님
        //2. 순서가 잘못된 경우 올바른 스킬트리가 아님
    private boolean isNotRightSkillTree(int curSkillIndex , int nextSkillIndex){
        if(!isExistInSkillTree(curSkillIndex) && isExistInSkillTree(nextSkillIndex)){
            return true;
        }else if(isWrongOrderSkillTree(curSkillIndex, nextSkillIndex)){
            return true;
        }

        return false;
    }
}

profile
HW -> FW -> Web
post-custom-banner

0개의 댓글