
[프로그래머스] 스킬트리 (java)
zl존석동
·2022. 8. 24. 16:01
프로그래머스 level2 - 스킬트리 자바 풀이
프로그래머스
코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.
programmers.co.kr
문제 요약
스킬을 한 시점에 하나 배울 수 있다.
연계 스킬들 정보가 주어지는데 연계 스킬들은 순서대로만 배울 수 있다.
연계 스킬이 아닌 스킬들은 언제든지 배울 수 있다.
연계 스킬 정보가 "ABC" 면 'C' 를 배우기 위해서는 'A , B' 를 배웠어야만 하는 이런 상태를 만족시켜서 스킬을 배웠는지 여부를 묻고 있다.
문제 풀이
사용자 스킬 스테이터스 저장소가 있다고 생각하고 저장소에 선행 스킬 정보가 있을 경우에만 다음 스킬을 배울 수 있다고 보면 될 것 같다.
연계스킬정보가 D -> A -> C 이고 다음과 같이 스킬 획득 요청이 있다고 생각해보자.
D는 선행스킬의 가장 첫 스킬이기 때문에 그냥 배울 수 있다.
요청은 C이고 배워야 할 스킬은 A이다.
연계 스킬트리 현황의 마지막 스킬이 D 이고 A는 없기 때문에 A를 배워야 하는 상황인데 요청은 C이기 때문에 잘못된 요청이다.
다음과 같은 획득 요청 순서였다면 배울 수 있을 것이다.
결국 사용자가 배웠던 스킬현황 목록들 중 가장 마지막 스킬이 무엇인지에 대해서 관심을 두고 그 다음 스킬이 무엇인지와 현재 배우고자 하는 스킬이 무엇인지를 비교해 모든 스킬 획득 요청에 대해 유효한지 검사할 수 있다.
따라서 스택이나 큐를 활용하면 쉽게 풀 수 있을 것 같다.
스택이라면 유효하면 넣고 검사할 때는 마지막 놈만 조회해와서 요청과 비교해 판단하면 된다.
큐라면 모든 연계 스킬 정보를 넣고 맨 앞의 스킬과 요청을 비교해 판단하고 큐에서 제거하면 된다.
스킬 학습에 있어 순서가 있다는 것을 응용해 큐나 반복을 활용하지 않고 문자열의 startWith 메소드를 활용해 매우 간단하게 풀어보았다.
연계스킬이 아닌 스킬 요청들만 다 필터링하고 남는 것들이 D이던 DA 이던 DAC 이던
주어진 DAC가 해당되는 요청으로 시작하는 문자열인지만 비교하면 유효하다는 것을 증명할 수 있다.
검사 불필요 스킬 문자 필터링은 정규식을 사용했다.
풀이 코드
public static int solution(String skill, String[] skill_trees) {
String regex = "[^" + skill + "]";
return (int) Arrays.stream(skill_trees)
.filter(tree -> skill.startsWith(tree.replaceAll(regex, "")))
.count();
}
실질적인 검증을 위한 별도의 복잡한 과정을 따로 생각할 필요가 없게 된다.
'알고리즘 & 자료구조 > 프로그래머스' 카테고리의 다른 글
[프로그래머스] 빛의 경로 사이클 (java) (0) | 2022.10.01 |
---|---|
[프로그래머스] 파일명 정렬 (java) (0) | 2022.08.15 |
[프로그래머스] 파괴되지 않은 건물(java) (0) | 2022.07.18 |
[프로그래머스] 소수찾기 (Java) (0) | 2022.02.03 |
[프로그래머스] 다리를 지나는 트럭 (java) (0) | 2022.01.13 |