일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | |||
5 | 6 | 7 | 8 | 9 | 10 | 11 |
12 | 13 | 14 | 15 | 16 | 17 | 18 |
19 | 20 | 21 | 22 | 23 | 24 | 25 |
26 | 27 | 28 | 29 | 30 | 31 |
- 라우터
- leetcode
- 모드 설정
- Router
- 웹해킹
- 취약점진단
- 미터프리터
- wpscan
- study
- algotithm
- SQLMap
- Suninatas
- metasploit
- hackerrank
- programmers
- ToDoList
- todo
- 정보시스템
- StringBuilder
- 취약점
- HTML Injection
- 써니나타스
- stock price
- java
- meterpreter
- SQL Injection
- CSRF
- 모의해킹
- todo List
- Algorithm
- Today
- Total
보안 / 개발 챌린저가 목표
[AlphaGo Study] [Programmers] [JAVA] 스킬트리 본문
문제 설명
선행 스킬이란 어떤 스킬을 배우기 전에 먼저 배워야 하는 스킬을 뜻합니다.
예를 들어 선행 스킬 순서가 스파크 → 라이트닝 볼트 → 썬더
일때, 썬더를 배우려면 먼저 라이트닝 볼트를 배워야 하고, 라이트닝 볼트를 배우려면 먼저 스파크를 배워야 합니다.
위 순서에 없는 다른 스킬(힐링 등)은 순서에 상관없이 배울 수 있습니다. 따라서 스파크 → 힐링 → 라이트닝 볼트 → 썬더
와 같은 스킬트리는 가능하지만, 썬더 → 스파크
나 라이트닝 볼트 → 스파크 → 힐링 → 썬더
와 같은 스킬트리는 불가능합니다.
선행 스킬 순서 skill과 유저들이 만든 스킬트리를 담은 배열 skill_trees가 매개변수로 주어질 때, 가능한 스킬트리 개수를 return 하는 함수를 작성해주세요.
제한 사항
☞ 스킬은 알파벳 대문자로 표기하며, 모든 문자열은 알파벳 대문자로만 이루어져 있습니다.
☞ 스킬 순서와 스킬트리는 문자열로 표기합니다.
⇒ 예를 들어, C → B → D
라면 "CBD"로 표기합니다.
☞ 선행 스킬 순서 skill의 길이는 1 이상 26 이하이며, 스킬은 중복해 주어지지 않습니다.
☞ skill_trees는 길이 1 이상 20 이하인 배열입니다.
☞ skill_trees의 원소는 스킬을 나타내는 문자열입니다.
⇒ skill_trees의 원소는 길이가 2 이상 26 이하인 문자열이며, 스킬이 중복해 주어지지 않습니다.
입출력 예
skill | skill_trees | return |
"CBD" | ["BACDE", "CBADF", "AECB", "BDA"] | 2 |
입출력 예 설명
#예제 1
"BACDE" : B 스킬을 배우기 전에 C 스킬을 먼저 배워야 합니다. 불가능한 스킬트리입니다.
#예제 2
"CBADF" : 가능한 스킬트리입니다.
#예제 3
"AECB" : 가능한 스킬트리입니다.
#예제 4
"BDA" : B 스킬을 배우기 전에 C 스킬을 먼저 배워야 합니다. 불가능한 스킬트리입니다.
programmers.co.kr/learn/courses/30/lessons/49993
문제를 풀기 전 THINK
§ 스킬의 순서만 지키면 중간에 어떤 값들이 들어와도 상관 없음.
§ 꼭 스킬을 다 써야할 필요 없음.
§ for문은 skill_trees의 길이만큼, 그 안에서는 skill_trees[i]의 길이만큼 반복.
§ skill_trees[i]를 한 글자씩 잘라서 그 값이 list에 존재하는데 0, 1, 2 순으로 증가하면 정상(indexOf 사용)
§ 0번째 부터 시작이 아니라면 스킬을 이상하게 올린 것.
§ 이상하게 올린 것은 answer에서 -1 시킨 후 for문 빠져 나옴.
나의 Solution
public class SkillTree {
public static int solution(String skill, String[] skill_trees) {
int answer = skill_trees.length;
int val;
LinkedList<String> list = new LinkedList<>();
// list 안에 skill 값들을 하나씩 넣어줌
for(int i = 0; i < skill.length(); i++) {
list.add(skill.substring(i, i + 1));
} // for end
// 스킬 트리 중 1개의 스킬 트리를 가져와서
for(int i = 0; i < skill_trees.length; i++) {
val = 0;
// 해당 스킬의 순서가 잘 되어있는지 확인
for(int j = 0; j < skill_trees[i].length(); j++) {
if(list.contains(skill_trees[i].substring(j, j + 1))) {
// 정상적으로 스킬 트리 진행되는 경우
if(val == list.indexOf(skill_trees[i].substring(j, j + 1))) {
val++;
} else { // 순서 잘못된 경우
answer -= 1;
break; // 끝내고 다음 스킬트리 검사하러
} // if ~ else end
} // if end
} // for(j) end
} // for(i) end
return answer;
}
'Development > Algorithm' 카테고리의 다른 글
[AlphaGo Study] [Programmers] [JAVA] 주식가격 (0) | 2020.10.27 |
---|---|
[AlphaGo Study] [Programmers] [JAVA] 캐시 (0) | 2020.10.23 |
[AlphaGo Study] [LeetCode] [JAVA] 15. 3 Sum (0) | 2020.10.17 |
[AlphaGo Study] [LeetCode] [JAVA] 43. Multiply Strings (0) | 2020.10.15 |
[AlphaGo Study] [LeetCode] [JAVA] 136. Single Number (0) | 2020.10.06 |