코딩테스트-알고리즘/프로그래머스

[프로그래머스/Lv.2] 스킬트리

닉네임생각즁 2024. 1. 30. 21:07

 

https://school.programmers.co.kr/learn/courses/30/lessons/49993#

 

프로그래머스

코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.

programmers.co.kr

 

스킬이 "CBD"라면 스킬트리에 서로 붙어있든 떨어져있든 **C**B**D** 순으로 있어야한다

그리고 전부가 나오지는 않아도되나 B는 앞에 C가 없으면 나올 수 없고 D는 앞에 B 그리고 C가 없다면 나올 수 없다

스킬트리 배열을 돌며 조건에 만족하면 count를 더해주는데 우선 스킬 글자 그대로 포함되어있다면 나눠서 따져볼 필요가 없어서 바로 count를 더해주었고 아니라면 check함수로 가서 확인하는 절차를 가졌다

 

check함수는 다음과 같은 생각으로 짜보았는데

"CBD"로 예를 들자면

B가 포함되어있는지 먼저 확인하고 포함되어있다면 해당 인덱스 앞까지를 확인해서 C가 포함되어있는지 확인한다 만족하면 다음으로 D가 포함되어있는지 확인하고 포함되어있다면 해당 인덱스 자리 앞까지를 확인해서 B가 포함되어있는지 확인한다 스킬이 더 길다면 같은 과정을 계속 반복하면 된다

 

	for(int i = 1; i < skill.length(); i++) {
            if(s.contains("" + skill.charAt(i))) {
                int n = s.indexOf(skill.charAt(i));
                //System.out.println(n);
                if(s.substring(0, n).contains(("" + skill.charAt(i-1)))) {
                    continue;
                }

 

(두번째 자리에 있는 글자부터 확인하기 때문에 i = 1로 시작한다)

 

이 과정 중에 만족하지 않는게 있다면 result 값을 0으로 바꾸고 return하고 끝까지 다 만족한다면 result는 처음 설정한 값 1 그대로 돌아오게 된다 그래서 1이라면 count를 해주면 된다!

 

 

최종 코드

class Solution {
    static int count = 0;
    static int result;
    
    public static int solution(String skill, String[] skill_trees) {

        for(String s : skill_trees) {
            if(s.contains(skill)) {
                count++;
            } else {
                check(s, skill, skill_trees);
                if(result == 1) count++;
                else continue;
            }
        }

        return count;
    }

    static void check(String s, String skill, String[] skill_trees) {
        result = 1;

        for(int i = 1; i < skill.length(); i++) {
            if(s.contains("" + skill.charAt(i))) {
                int n = s.indexOf(skill.charAt(i));
                //System.out.println(n);
                if(s.substring(0, n).contains(("" + skill.charAt(i-1)))) {
                    continue;
                } else {
                    result = 0;
                    return;
                }
            }
        }
    }

}