본문 바로가기
자료구조 & 알고리즘/문제풀이

스킬트리 - 프로그래머스 (Java, Level 2)

by 넬준 2022. 8. 5.

 

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

 

처음 풀이

public int solution(String skill, String[] skillTrees) {
char[] charArr = skill.toCharArray();
//skill 탐색 위한 index (index+1부터)
int index = -1;
int cnt = 0;
//선행 스킬에 포함되지만 순서 맞지 않는 경우,
//연산을 빠져나오기 위한 flag
boolean check = true;
for (String skillTree : skillTrees) {
//새 skillTree마다 check, index 변수 초기화
check = true;
index = -1;
int length = skillTree.length();
for (int i = 0; i < length; i++) {
for (int j = index+1; j < charArr.length; j++) {
if (skillTree.charAt(i) == charArr[j]) {
//skillTree의 스킬이 skill에 포함된 경우
if (j!=index+1) {
//포함되었지만 순서가 맞지 않은 경우
//해당 skillTree에서의 연산(for문)을 빠져나가기 위해
check = false;
break;
} else {
//포함되고, 현재 순서가 맞은 경우
index++;
}//if else end
}//if end
}//for end
if(!check) break;
}//for end
if(check) {
cnt++;
}//if end
}//for() end
return cnt;
}//solution() end

 

 

다른 풀이

//String의 method들 활용 (런타임 에러)
//contains(), indexOf()
public int solution2(String skill, String[] skillTrees) {
int cnt = 0;
for(String skillTree : skillTrees) {
for(int i=0; i<skillTrees.length; i++) {
String s = skillTree.substring(i, i+1);
if(skill.contains(s)) {
if(skill.indexOf(s)==0) {
cnt++;
} else {
break;
}//if end
}//if end
}//for end
}//for end
return cnt;
}//solution2() end

 

contains(), indexOf() 등을 활용한 풀이다.

실제로 돌리면 runtime error가 난다. 

 

 

//정규표현식 활용
//[^skill]로 skill에 해당하지 않는 문자를 빈 문자로 치환
//해당 변환 문자열
//replaceAll() indexOf()
public static void solution3(String skill, String[] skillTrees ) {
int cnt = 0;
for(String skillTree : skillTrees) {
if(skill.indexOf(skillTree.replaceAll("[^"+skill+"]", ""))==0) cnt++;
}
System.out.println(cnt);
}//solution3() end

 

정규표현식을 사용한 풀이다.

[^skill]식으로 skill에 포함되지 않은 스킬은 전부 빈 문자로 치환한다.

그 치환된 문자열을 본래 skill과 indexOf() 비교하여 0인 경우만 count해준다.

skill이 "BCD"라면, indexOf()기 때문에 B->C->D 순서가 아니면 0이 나올 수 없기 때문이다.

 

댓글