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\]"
반응형