Algorithm/Programmars

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

mopipi 2024. 2. 21. 19:38
반응형

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

 

프로그래머스

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

programmers.co.kr


import java.util.*;
class Solution {
    char[] skills;
    public int solution(String skill, String[] skill_trees) {
        skills = skill.toCharArray();
        //skill안 문자를 포함하지 않은 경우 처리
        String regex = "[^"+ skill + "]"; 
        int answer = 0;
        for(String s : skill_trees){
            String tmp = s.replaceAll(regex, ""); //스킬 트리에 해당하는 문자만 남겨놓고
            if(tmp.equals("")){
                answer++;
                continue;
            }
            if(isCorrect(tmp))
                answer++;
        }
        return answer;
    }
    private boolean isCorrect(String tmp) {
        int idx = 0;
        for(char s : tmp.toCharArray()){
            if(skills[idx] == s){
                idx++;
                continue;
            }
            return false;
        }
        return true;
    }
}

💡 정규식

풀이

처음엔 skill을 쪼갠 다음 정규식 + matches 로 해결하려고 했음

But 예외 (CBD인 경우, C 나 CB까지만 포함해도 카운팅 해야 되는데 얘가 불가능

>> 그렇다고 ?C ?B ?D를 하자니.. CD도 허용할 수 있어서 안됨

>> 문자를 전부 비교하자니 너무 많고,,, 스킬에 해당하지 않는 문자까지 섞여서 처리가 어려움

import java.util.*;
class Solution {
    public int solution(String skill, String[] skill_trees) {
        char[] st = skill.toCharArray();
        StringBuilder sb = new StringBuilder(".*");
        for(char s : st){
            sb.append(s).append(".*");
        }
        String rg = sb.toString(); //".*C.*B.*D.*" REGEX 생성 (순서 중요)

        int answer = 0;
        for(String sk : skill_trees){
            if(sk.matches(rg)){
                System.out.println(sk);
                answer++; 
            }
        }
        return answer;
    }
}

 

💡 먼저, skill에 해당없는 문자를 먼저 지워주고 → 스킬 트리 구성 문자만 남았을 때 (=C, B, D), 순서가 맞는지 비교

      skill에 해당하는 문자를 포함하지 않는 경우 REGEX >> "\[^CBD\]"

반응형