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이 나올 수 없기 때문이다.
'자료구조 & 알고리즘 > 문제풀이' 카테고리의 다른 글
안정적인 문자열 - 백준 4889 (Java) (0) | 2022.08.11 |
---|---|
문자열 압축 - 프로그래머스 (Java , Level 3) (0) | 2022.08.10 |
땅따먹기 - 프로그래머스 (Java, Level 2) (0) | 2022.08.05 |
디스크 컨트롤러 - 프로그래머스 (Java, Level 3) (0) | 2022.08.05 |
프린터 - 프로그래머스 (Java, Level 2) (0) | 2022.08.04 |
댓글