본문 바로가기
Language/알고리즘 문제풀이

프로그래머스 스킬트리 풀이

by wakestand 2019. 9. 3.
반응형

사이트명 : 프로그래머스(Programmers)

문제명 : 스킬트리

언어 : 자바(Java) 

 

위의 내용은 쉬운 말을 어렵게 써 놨는데

 

우선 skill_trees를 쭉 받은 뒤 skill과 비교해봐야 하는데

C B D의 순서만 지키면 중간에 어떤 값이 들어와도 상관이 없고

C B D가 꼭 다 들어가지 않아도 된다

 

그러나 순서가 맞지 않는 경우에는 체크하면 안된다

요약해보니 간단한데

 

내 풀이방법은 아래와 같다

 

먼저 리스트 안에 skill 값을 잘라서 넣어주는데

skill.substring(i, i+1); 로 한글자식 잘라서 편하게 넣어줄 수 있다

 

다음에는 for문을 두번 돌려주는데

배열 skill_trees의 길이만큼

그리고 그 안에서 skill_trees[i]의 길이만큼(배열 인덱스 값당 길이)

돌리게 되는데

 

skill_trees[i].length만큼 for문을 돌릴 때

if문을 걸어줘서 

skill_trees[i]를 한글자씩 잘라본 값이 list에 존재하는데

그 값이 0번째 1번째 2번째 순으로 증가한다면 정상적인 것이고(list.indexOf로 확인)

0번째부터 시작하는 것이 아니라면 스킬트리를 이상하게 올린 것이므로

answer에서 -1 시킨 후 break; 시킨다

 

for문을 계속 돌려가며 정상적이지 않은 스킬트리만 빼면

정상적인 스킬트리만 남게 되는데

이 값을 반환하면 끝이 난다

 

마지막으로 프로그래머스에 바로 적용 가능한 답안은 아래와 같다

 

import java.util.LinkedList;

class Solution {
    public int solution(String skill, String[] skill_trees) {
        int answer = skill_trees.length;
        int treeValue = 0;
        LinkedList<String> list = new LinkedList<>();
        
        // List 안에 Skill 값을 하나씩 잘라 넣어줌..
        for(int i = 0; i<skill.length(); i++) {
        	list.add(skill.substring(i, i+1));
        }
        
        // skill_trees를 가져온다
        // 선행 스킬 순서 skill의 길이는 1 이상 26 이하이며, 스킬은 중복해 주어지지 않습니다
        // 비교 시 skill에 속하는 값인데 최초값 혹은 현재값보다 크다면 X
        // 트리를 다 수행하지 않아도 PASS
        for(int i = 0; i<skill_trees.length; i++) {
        	for(int j = 0; j<skill_trees[i].length(); j++) {
        		if(list.contains(skill_trees[i].substring(j, j+1))) {
        			// 정상적으로 스킬트리를 진행할 경우
        			if(treeValue == list.indexOf(skill_trees[i].substring(j, j+1))) {
        				treeValue++; // KEEP GOING
        			} else { // 스킬트리 순서가 잘못된 경우
        				answer = answer - 1;
        				break; // 중단
        			}
        		}
        	}
        	treeValue = 0;
        }
        
        return answer;
    }
}
반응형

댓글